WojciechMula / toys

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

Add AVX2 int8 summation (maddubs variant) #8

Closed mayeut closed 5 years ago

mayeut commented 5 years ago

This variant seems much better on my Haswell CPU. I expect it to do better as well on Skylake (given sadbw/maddubs changes in latency/throughput between the 2 architectures) but that remains to be confirmed.

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.138 cycle/op (best)    0.162 cycle/op (avg)
scalar (C++)                    :     0.122 cycle/op (best)    0.140 cycle/op (avg)
SSE                             :     0.305 cycle/op (best)    0.350 cycle/op (avg)
SSE (v2)                        :     0.305 cycle/op (best)    0.326 cycle/op (avg)
SSE (sadbw)                     :     0.138 cycle/op (best)    0.154 cycle/op (avg)
SSE (sadbw, unrolled)           :     0.153 cycle/op (best)    0.156 cycle/op (avg)
AVX2                            :     0.166 cycle/op (best)    0.183 cycle/op (avg)
AVX2 (v2)                       :     0.153 cycle/op (best)    0.159 cycle/op (avg)
AVX2 (sadbw)                    :     0.073 cycle/op (best)    0.077 cycle/op (avg)
AVX2 (sadbw, unrolled)          :     0.066 cycle/op (best)    0.083 cycle/op (avg)
AVX2 (maddubs)                  :     0.024 cycle/op (best)    0.032 cycle/op (avg)
element count 16384
scalar                          :     0.124 cycle/op (best)    0.140 cycle/op (avg)
scalar (C++)                    :     0.124 cycle/op (best)    0.142 cycle/op (avg)
SSE                             :     0.304 cycle/op (best)    0.338 cycle/op (avg)
SSE (v2)                        :     0.304 cycle/op (best)    0.334 cycle/op (avg)
SSE (sadbw)                     :     0.136 cycle/op (best)    0.154 cycle/op (avg)
SSE (sadbw, unrolled)           :     0.136 cycle/op (best)    0.144 cycle/op (avg)
AVX2                            :     0.160 cycle/op (best)    0.175 cycle/op (avg)
AVX2 (v2)                       :     0.152 cycle/op (best)    0.169 cycle/op (avg)
AVX2 (sadbw)                    :     0.070 cycle/op (best)    0.075 cycle/op (avg)
AVX2 (sadbw, unrolled)          :     0.065 cycle/op (best)    0.077 cycle/op (avg)
AVX2 (maddubs)                  :     0.023 cycle/op (best)    0.026 cycle/op (avg)
element count 32768
scalar                          :     0.122 cycle/op (best)    0.141 cycle/op (avg)
scalar (C++)                    :     0.122 cycle/op (best)    0.139 cycle/op (avg)
SSE                             :     0.304 cycle/op (best)    0.340 cycle/op (avg)
SSE (v2)                        :     0.304 cycle/op (best)    0.334 cycle/op (avg)
SSE (sadbw)                     :     0.135 cycle/op (best)    0.178 cycle/op (avg)
SSE (sadbw, unrolled)           :     0.136 cycle/op (best)    0.171 cycle/op (avg)
AVX2                            :     0.160 cycle/op (best)    0.179 cycle/op (avg)
AVX2 (v2)                       :     0.152 cycle/op (best)    0.165 cycle/op (avg)
AVX2 (sadbw)                    :     0.070 cycle/op (best)    0.081 cycle/op (avg)
AVX2 (sadbw, unrolled)          :     0.066 cycle/op (best)    0.072 cycle/op (avg)
AVX2 (maddubs)                  :     0.023 cycle/op (best)    0.025 cycle/op (avg)
mayeut commented 5 years ago

I pushed a 2nd commit with a sadbw variant which might perform better on skylake (not the case on haswell)

WojciechMula commented 5 years ago

Hi, thanks a lot. I didn't even consider maddubs instruction :) Love it.

Will upgrade the article soon.

WojciechMula commented 5 years ago

The button "Comment and close" is bigger than "Merge" :)