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

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

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

В принципе, я пытаюсь прорисовать следующий код ванильного С++:

 //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 делает точку, требующую уточнения с моей стороны. Я не пытаюсь добиться ускорения для кода таблицы поиска, я просто пытаюсь избежать необходимости сохранять регистры обратно в float специально для выполнения поиска, так как эта часть зажата между двумя другими частями, которые теоретически могут выиграть от SSE.

Ответ 1

Если вы можете подождать до следующего года, то процессоры Intel Haswell будут иметь AVX2, который включает инструкции для собранных нагрузок. Это позволяет вам делать, например, 8 параллельных запросов LUT в одной инструкции (см., Например, VGATHERDPS). Кроме того, вам не повезло, если ваши LUT не очень малы (например, 16 элементов), и в этом случае вы можете использовать PSHUFB.