WojciechMula / toys

Storage for my snippets, toy programs, etc.
BSD 2-Clause "Simplified" License
316 stars 38 forks source link

Add AVX2 uint16 summation madd variant #9

Closed mayeut closed 5 years ago

mayeut commented 5 years ago

madd proves better on Haswell than the v2 (not by much) or sadbw. I'm once again curious about how it compares on Skylake (sadbw has lower latency but madd has higher throughput)

Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz (Haswell) Apple LLVM version 10.0.0 (clang-1000.11.45.5)

element count 4096
rdtsc_overhead set to 24
scalar                          :     0.133 cycle/op (best)    0.152 cycle/op (avg)
scalar (C++)                    :     0.123 cycle/op (best)    0.131 cycle/op (avg)
SSE                             :     0.250 cycle/op (best)    0.258 cycle/op (avg)
SSE (v2)                        :     0.171 cycle/op (best)    0.202 cycle/op (avg)
SSE (sadbw)                     :     0.205 cycle/op (best)    0.231 cycle/op (avg)
SSE (sadbw, v2)                 :     0.171 cycle/op (best)    0.199 cycle/op (avg)
SSE (sadbw, unrolled)           :     0.204 cycle/op (best)    0.235 cycle/op (avg)
AVX2                            :     0.142 cycle/op (best)    0.189 cycle/op (avg)
AVX2 (v2)                       :     0.089 cycle/op (best)    0.093 cycle/op (avg)
AVX2 (sadbw)                    :     0.113 cycle/op (best)    0.120 cycle/op (avg)
AVX2 (sadbw-v2)                 :     0.092 cycle/op (best)    0.103 cycle/op (avg)
AVX2 (sadbw, unrolled)          :     0.104 cycle/op (best)    0.118 cycle/op (avg)
AVX2 (madd)                     :     0.081 cycle/op (best)    0.088 cycle/op (avg)
element count 16384
scalar                          :     0.123 cycle/op (best)    0.136 cycle/op (avg)
scalar (C++)                    :     0.122 cycle/op (best)    0.139 cycle/op (avg)
SSE                             :     0.253 cycle/op (best)    0.287 cycle/op (avg)
SSE (v2)                        :     0.172 cycle/op (best)    0.194 cycle/op (avg)
SSE (sadbw)                     :     0.212 cycle/op (best)    0.220 cycle/op (avg)
SSE (sadbw, v2)                 :     0.174 cycle/op (best)    0.194 cycle/op (avg)
SSE (sadbw, unrolled)           :     0.213 cycle/op (best)    0.234 cycle/op (avg)
AVX2                            :     0.130 cycle/op (best)    0.183 cycle/op (avg)
AVX2 (v2)                       :     0.085 cycle/op (best)    0.089 cycle/op (avg)
AVX2 (sadbw)                    :     0.109 cycle/op (best)    0.114 cycle/op (avg)
AVX2 (sadbw-v2)                 :     0.093 cycle/op (best)    0.103 cycle/op (avg)
AVX2 (sadbw, unrolled)          :     0.104 cycle/op (best)    0.112 cycle/op (avg)
AVX2 (madd)                     :     0.079 cycle/op (best)    0.086 cycle/op (avg)
element count 32768
scalar                          :     0.143 cycle/op (best)    0.158 cycle/op (avg)
scalar (C++)                    :     0.143 cycle/op (best)    0.160 cycle/op (avg)
SSE                             :     0.254 cycle/op (best)    0.277 cycle/op (avg)
SSE (v2)                        :     0.204 cycle/op (best)    0.216 cycle/op (avg)
SSE (sadbw)                     :     0.253 cycle/op (best)    0.268 cycle/op (avg)
SSE (sadbw, v2)                 :     0.222 cycle/op (best)    0.228 cycle/op (avg)
SSE (sadbw, unrolled)           :     0.250 cycle/op (best)    0.265 cycle/op (avg)
AVX2                            :     0.132 cycle/op (best)    0.202 cycle/op (avg)
AVX2 (v2)                       :     0.102 cycle/op (best)    0.113 cycle/op (avg)
AVX2 (sadbw)                    :     0.133 cycle/op (best)    0.142 cycle/op (avg)
AVX2 (sadbw-v2)                 :     0.120 cycle/op (best)    0.129 cycle/op (avg)
AVX2 (sadbw, unrolled)          :     0.124 cycle/op (best)    0.141 cycle/op (avg)
AVX2 (madd)                     :     0.085 cycle/op (best)    0.090 cycle/op (avg)
WojciechMula commented 5 years ago

Thanks a lot, I'm running benchmarks.