2012-05-14 5 views
10

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.

+0

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

+2

@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

Antwort

12

Wenn Sie bis nächstes Jahr warten können, dann haben Intels Haswell-CPUs AVX2, die Anweisungen für die gesammelten Lasten enthält. Dadurch können Sie z.B. 8 parallele LUT-Lookups in einem Befehl (siehe z.B. VGATHERDPS). Abgesehen davon haben Sie Pech, es sei denn, Ihre LUTs sind ziemlich klein (z. B. 16 Elemente). In diesem Fall können Sie PSHUFB verwenden.

+0

Leider sind meine LUTs 10000 Elemente groß. Selbst wenn ich auf einen neuen Prozessor warten würde, würde es Jahre dauern, bis es legitim wäre, Haswell als minimale CPU zu spezifizieren. :) Danke für die Information. – Rotem

+1

OK - wenn Sie Ihre LUTs, z. Mit einem Polynom kann man dann immer noch mit SSE gewinnen, sonst fürchte ich, dass Sie mit Skalar-Code stecken bleiben. –

+3

Skalar-Code ist es dann. Das sind in gewisser Weise gute Nachrichten, ich kann aufhören, mich um diesen Teil zu kümmern, und an Teilen arbeiten, die sich als besser zu optimieren erweisen. – Rotem