SSE (SIMD):multiplicar vector por escalar

SSE (SIMD):multiplicar vector por escalar


Una operación común que hago en mi programa es escalar vectores por un escalar (V*s, por ejemplo, [1,2,3,4]*2 ==[2,4,6,8]). ¿Existe una instrucción SSE (o AVX) para hacer esto, además de cargar primero el escalar en cada posición en un vector (por ejemplo, _mm_set_ps(2,2,2,2)) y luego multiplicar?


Esto es lo que hago ahora:


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

Estoy buscando algo como...


__m128 _result = _mm_scale_ps(_vector, s);

Respuestas:


Dependiendo de su compilador, puede mejorar un poco la generación de código usando _mm_set1_ps :


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

Sin embargo, las constantes escalares como esta solo deberían inicializarse una vez, fuera de cualquier ciclo, por lo que el costo de rendimiento debería ser irrelevante. (¿A menos que el valor escalar esté cambiando dentro del ciclo?)


Como siempre, debe mirar el código que genera su compilador y también intentar ejecutar su código en un generador de perfiles decente para ver dónde están realmente los puntos críticos.