SSE intrinsics
-
Nabend,
int a, b, c d; //... int x = a == b ? c : d;Da ich diese Operation auf sehr vielen Daten ausführe, versuche ich gerade SSE auszunutzen:
__mi128i a, b, c, d; // ... mit Zeugs fuellen... __m128i cmp = _mm_cmpeq_epi32(a, b); cmp = _mm_or_si128(_mm_and_si128(cmp, c),_mm_andnot_si128(cmp, d)); //oder das gleiche ab SSE4.1: //cmp = _mm_blendv_epi8(d, c, cmp);Der Code funktioniert, auch die SSE4.1 Version, sie bringt aber keinen Performancegewinn im Vergleich zum alten SSE.
Weiß jemand, ob man das noch schneller hinkriegt? Die Stelle ist der Flaschenhals in der Funktion momentan.
-
Hab' von Optimierung zwar wenig Ahnung, aber wie wär's mit e.g.
int x = c + (d-c)*(a==b)So wäre doch die Branch gespart?
-
Ich würde erst mal schauen, was der Compiler bei höchster Optimierungsstufe draus macht. Ich könnte mir vorstellen das dort Handoptimierung gar nichts bringt weil ein Compiler auch so clever ist.
-
@Arcoth
Danke, gute Idee! Es müsste aber das hier ein:int x = c + (d-c)*(a!=b)Damit krieg ich richtige Ergebnisse und mein normaler C++ Code ist damit 20% schneller geworden.
Bei der SSE Version bringts leider nichts, weil dort die Branch eh schon wegfällt im bisherigen Code.
@TNA:
Der Compiler scheint dort nix schlaues zu machen (habe nicht aufs assembly geschaut, kenn mich dort nicht soo gut aus). Meine bisherige SSE Version ist aber um den Faktor 2.5 schneller (4 wäre theoretisch maximal), wird aber wohl wegen Datenaufbereitung nicht erreicht werden. Ich hätte es jedoch trotzdem noch gerne etwas schneller.