Mam dużą funkcję przetwarzania pikseli, którą obecnie próbuję optymalizować za pomocą funkcji wewnętrznych.Tablica przeglądowa za pomocą SIMD
Będąc nowicjuszem SSE, nie jestem pewien, jak poradzić sobie z częścią kodu, która wymaga tablic przeglądowych.
Zasadniczo próbuję wektorować następujące waniliowy kodu C++:
//outside loop
const float LUT_RATIO = 1000.0F;
//in loop
float v = ... //input value
v = myLookupTable[static_cast<int>(v * LUT_RATIO)];
Próbuję:
//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 sprawia, że punkt, który wymaga wyjaśnienia z mojej strony. Nie próbuję osiągnąć przyspieszenia w odniesieniu do kodu tabeli odnośników, staram się jedynie uniknąć konieczności przechowywania rejestrów z powrotem do floats specjalnie do wyszukiwania, ponieważ ta część jest umieszczona pomiędzy 2 innymi częściami, które teoretycznie mogłyby skorzystać z SSE.
Kto jest przekonany, że można poprawić na 'myLookupTable [static_cast (v) * LUT_RATIO]'? Nie ma tutaj żadnych obliczeń, dlaczego SSE miałoby zastosowanie? –
ildjarn
@ildjarn Jestem prawie pewien, że nie mogę poprawić tej części per se, ale mam nadzieję poprawić inne części tej funkcji i uniknąć kary przesuwania się pomiędzy '__m128' i' float [4] ' Muszę też wektoryzować ten kod. – Rotem