Поисковая таблица с использованием SIMD

У меня есть функция обработки больших пикселей, которую я сейчас пытаюсь оптимизировать с помощью встроенных функций.

Будучи новичком в SSE, я не знаю, как справиться с той частью кода, которая связана с поисковыми таблицами.

По сути, я пытаюсь векторизовать следующий ванильный код C++:

 //outside loop
const float LUT_RATIO = 1000.0F;

//in loop
float v = ... //input value
v = myLookupTable[static_cast<int>(v * LUT_RATIO)];

Что я пытаюсь:

//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?

edit: ildjarn делает вывод, требующий пояснений с моей стороны. Я не пытаюсь добиться ускорения кода таблицы поиска, я просто пытаюсь избежать необходимости сохранять регистры обратно в числа с плавающей запятой специально для выполнения поиска, поскольку эта часть зажата между двумя другими частями, которые теоретически могли бы выиграть от SSE.

13
задан Rotem 3 December 2013 в 09:05
поделиться