2013-06-13 14 views
6

Con SSE è possibile caricare un singolo galleggiante dalla memoria in tutte 4 slot di un __m128 con _mm_load1_ps intrinseci()AVX 256 bit equivalente per _mm_load1_ps

Quando utilizzando un'ampia SIMD 256 bit con AVX, sembra esserci no _mm256_load1_ps() per caricare un singolo float dalla memoria in tutti gli 8 slot del vettore.

Perché questa omissione e qual è il modo migliore per aggirare questo problema?

O meglio ancora: c'è un modo per caricare un singolo float in uno slot mirato a 0..7 del vettore?

+0

AVX e AVX2 consentono ancora solo di inserire elementi nel basso 128 ('PINSRD' /' INSERTPS': numero elemento = costante di compilazione). Facendo ciò senza azzerare il upper128 è possibile solo con la codifica non-VEX, innescando un massiccio rallentamento su Intel pre-Skylake dalla combinazione di istruzioni VEX e non-VEX. È possibile estrarref128, insertps, insertf128. –

+0

'_mm_load1_ps' è un intrinseco composito per' movss' + shuffle per trasmettere un float. Se eri già disposto a fare in modo che il compilatore facesse quello che voleva ottenere una costante in un registro, '_mm256_set1_ps (* f)' è una buona scelta. I compilatori intelligenti emetteranno 'VBROADCASTSS' dove appropriato. –

risposta

9

_mm256_broadcast_ss è quello che stai cercando.

+0

Forse ho frainteso qualcosa, ma perché non fare _mm256_set1_ps (* x)? http://stackoverflow.com/questions/13218391/is-mm-broadcast-ss-faster-than-mm-set1-ps –

+2

_mm256_set1_ps (* x) funzionerebbe bene, ma può generare più istruzioni. _mm256_broadcast_ss è garantito per generare solo una istruzione, VBROADCASTSS –

Problemi correlati