I see your point. I am going to try and implement the approach I outlined above as well as the code gen. Glad you checked out "Inner Loops", I a guess my take away from that book is understand the machine, your code and most of all do some science. The hardware used the book is very dated, and I'd love to see a second edition using SkyLake or newer.
Maybe ... instead of doing the JMP back to the top of the loop, you combine the two approaches to like a direct threaded interpreter. In each AVX_INCR_ROUTINE modify the code by over writing the next JMP address, don't jump back to A0. The issue of consecutive duplicates arrises again.
Or ask the processor for some L1 cache that never gets flushed to main memory.
Or use R8-R15 as an 8x8 array of U8 counters, do 4 passes [0-63] [64-127] [128-191] [192-255] or a 4x8 array of U16 counters, would have to test.
Function Best Rate MB/s Avg time Min time Max time
Copy: 11569.0 0.145255 0.138301 0.154563
Scale: 11383.5 0.145140 0.140555 0.148503
Add: 12544.6 0.196920 0.191318 0.204782
Triad: 12464.8 0.198199 0.192542 0.207492
Maybe ... instead of doing the JMP back to the top of the loop, you combine the two approaches to like a direct threaded interpreter. In each AVX_INCR_ROUTINE modify the code by over writing the next JMP address, don't jump back to A0. The issue of consecutive duplicates arrises again.
Or ask the processor for some L1 cache that never gets flushed to main memory.
Or use R8-R15 as an 8x8 array of U8 counters, do 4 passes [0-63] [64-127] [128-191] [192-255] or a 4x8 array of U16 counters, would have to test.
from http://www.cs.virginia.edu/stream/FTP/Code/stream.cI still think the histogramming can get above 6GB/s