Tengo una gran función de procesamiento de píxeles que actualmente estoy tratando de optimizar utilizando funciones intrínsecas.Tabla de búsqueda utilizando SIMD
Siendo un novato SSE, no estoy seguro de cómo abordar la parte del código que implica tablas de búsqueda.
Básicamente, estoy tratando de vectorizar el siguiente código C vainilla ++:
//outside loop
const float LUT_RATIO = 1000.0F;
//in loop
float v = ... //input value
v = myLookupTable[static_cast<int>(v * LUT_RATIO)];
Lo que trato:
//outside loop
const __m128 LUT_RATIO = _mm_set1_ps(1000.0F);
//in loop
__m128 v = _mm_set_ps(v1, v2, v3, v4); //input values
__m128i vI = _mm_cvtps_epi32(_mm_mul_ps(v, LUT_RATIO)); //multiply and convert to integers
v = ??? // how to get vI indices of myLookupTable?
edición: Ildjarn hace un punto que exige una aclaración de mi parte. No estoy tratando de lograr una aceleración para el código de la tabla de búsqueda, simplemente estoy tratando de evitar tener que almacenar los registros en flotadores específicamente para hacer la búsqueda, ya que esta parte está intercalada entre otras 2 partes que teóricamente podrían beneficiarse de SSE.
¿A quién ha convencido de que puede mejorar 'myLookupTable [static_cast (v) * LUT_RATIO]'? No se realiza ningún cálculo aquí, ¿por qué sería aplicable la ESS? –
ildjarn
@ildjarn Estoy bastante seguro de que no puedo mejorar esta parte per se, pero espero mejorar otras partes de la función y evitar la penalización de avanzar y retroceder entre '__m128' y' flotar [4] ' También debo vectorizar este código. – Rotem