With SSE you can load a single float from memory into all 4 slots of a __m128 with the intrinsic _mm_load1_ps()
When using 256 bit wide SIMD with AVX, there seems to be no _mm256_load1_ps() to load a single float from memory into all 8 slots of the vector.
Why is this omission, and what's the best way around this?
Or even better: is there a way to load a single float to a targeted slot 0..7 of the vector?
PINSRD
/INSERTPS
: element number = compile-time constant). Doing this without zeroing the upper128 is only possible with the non-VEX encoding, triggering a massive slowdown on Intel pre-Skylake from mixing VEX and non-VEX instructions. You could extractf128, insertps, insertf128. – Peter Cordes_mm_load1_ps
is a composite intrinsic formovss
+ shuffle to broadcast a float. If you were already willing to let the compiler do whatever it felt like to get a constant into a register,_mm256_set1_ps(*f)
is a good choice. Smart compilers will emitVBROADCASTSS
where appropriate. – Peter Cordes