Ich habe eine große Pixel-Processing-Funktion, die ich derzeit mit intrinsischen Funktionen zu optimieren versuchen.Look-Up-Tabelle mit SIMD
Da ich ein SSE-Neuling bin, bin ich nicht sicher, wie man den Teil des Codes anpackt, der Lookup-Tabellen beinhaltet.
Grundsätzlich versuche ich, die folgende Vanille C++ Code vektorisieren:
//outside loop
const float LUT_RATIO = 1000.0F;
//in loop
float v = ... //input value
v = myLookupTable[static_cast<int>(v * LUT_RATIO)];
Was ich versuche:
//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 macht einen Punkt, der Klärung von mir verlangt. Ich versuche nicht, eine Beschleunigung für den Nachschlagetabellencode zu erreichen, ich versuche einfach zu vermeiden, dass ich die Register speziell für die Suche nach Floats speichern muss, da dieser Teil zwischen zwei anderen Teilen liegt, die theoretisch von SSE profitieren könnten.
Wer hat Sie davon überzeugt, dass Sie 'myLookupTable [static_cast (v) * LUT_RATIO]' verbessern können ''? Es wird hier keine Berechnung durchgeführt, warum sollte SSE anwendbar sein? –
ildjarn
@ildjarn Ich bin mir ziemlich sicher, dass ich diesen Teil nicht per se verbessern kann, aber ich hoffe, andere Teile der Funktion zu verbessern und den Nachteil zu vermeiden, zwischen '__m128' und' float [4] 'hin und her zu gehen Ich muss diesen Code auch vektorisieren. – Rotem