SSE (SIMD):moltiplica vettore per scalare

SSE (SIMD):moltiplica vettore per scalare


Un'operazione comune che faccio nel mio programma è il ridimensionamento dei vettori in base a uno scalare (V*s, ad esempio [1,2,3,4]*2 ==[2,4,6,8]). Esiste un'istruzione SSE (o AVX) per eseguire questa operazione, oltre a caricare prima lo scalare in ogni posizione in un vettore (ad es. _mm_set_ps(2,2,2,2)) e quindi moltiplicare?


Questo è quello che faccio ora:


__m128 _scalar = _mm_set_ps(s,s,s,s);
__m128 _result = _mm_mul_ps(_vector, _scalar);

Sto cercando qualcosa come...


__m128 _result = _mm_scale_ps(_vector, s);

Risposte:


A seconda del tuo compilatore potresti essere in grado di migliorare un po' la generazione del codice usando _mm_set1_ps :


const __m128 scalar = _mm_set1_ps(s);
__m128 result = _mm_mul_ps(vector, scalar);

Tuttavia, costanti scalari come questa dovrebbero essere inizializzate solo una volta, al di fuori di qualsiasi ciclo, quindi il costo delle prestazioni dovrebbe essere irrilevante. (A meno che il valore scalare non cambi all'interno del ciclo?)


Come sempre dovresti guardare il codice generato dal tuo compilatore e anche provare a eseguire il tuo codice con un profiler decente per vedere dove si trovano realmente gli hotspot.