8 ms·
There's a small bug in your code. The loop kernel writes out 16 entries despite only advancing by 15 entries, so your upper bound calculation needs adjustment.
by psykotic 6y ago
There's a small bug in your code. The loop kernel writes out 16 entries despite only advancing by 15 entries, so your upper bound calculation needs adjustment. I'm also worried the JVM's compiler won't be able to eliminate the array bounds checks because of how you calculate the upper bound with the modulus. Writing it like this should fix both issues:
// We need i + 15 < length to keep the last written entry in bounds.
for (; i < length - 15; i += 15)
- _old_dude_ 6y agoyes, right, if length is a multiple of 15, there is an issue. And there is no primitive for masking on AVX2, those are only available on AVX-256. if we want to minimize the iterations of the post loop, it should be var upperBound = length % 15 == 0? length - 15: length - length % 15; but as you said, i'm not sure the VM will eliminate the bound checks in that case so your solution seems to be the best var upperBound = length - 15
- vardump 6y ago> And there is no primitive for masking on AVX2, those are only available on AVX-256. Sure there is a masking MOV in the original AVX (thus including AVX2), VMASKMOV. Works for both masked loads and stores. https://www.felixcloutier.com/x86/vmaskmov https://www.felixcloutier.com/x86/vmaskmov Notably: "Faults occur only due to mask-bit required memory accesses that caused the faults. Faults will not occur due to referencing any memory location if the corresponding mask bit for that memory location is 0. For example, no faults will be detected if the mask bits are all zero." A nitpick: there's no such thing as AVX-256, you probably meant AVX-512.
- _old_dude_ 6y agoThanks, i've overlooked that var mask = VectorMask.fromLong(SPECIES, 0b0111_1111); var i = 0; var upperBound = length - length % 15; for(; i < upperBound; i += 15) { v1.intoArray(result, i); v2.intoArray(result, i + 8, mask); ...