2012-05-14 21 views
10

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.

+0

¿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

+2

@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

Respuesta

12

Si puede esperar hasta el próximo año, las CPU Haswell de Intel tendrán AVX2, que incluye instrucciones para las cargas acumuladas. Esto le permite hacer, p. 8 búsquedas paralelas de LUT en una instrucción (ver, por ejemplo, VGATHERDPS). Aparte de eso, no tienes suerte, a menos que tus LUT sean muy pequeñas (por ejemplo, 16 elementos), en cuyo caso puedes usar PSHUFB.

+0

Desafortunadamente, mis LUT tienen 10000 elementos de gran tamaño. Incluso si tuviera que esperar a un nuevo procesador, pasarían años hasta que fuera legítimo especificar Haswell como una CPU mínima. :) Gracias por la info. – Rotem

+1

Aceptar: si puede aproximar sus LUT, p. con un polinomio, entonces todavía puede obtener una victoria con SSE, de lo contrario, me temo que está atascado con el código escalar. –

+3

Código escalar es entonces. De alguna manera, esta es una buena noticia, puedo dejar de preocuparme por esta parte y trabajar en partes que podrían ser más optimizables. – Rotem