Am schnellsten horizontale Vektor-Summe mit AVX-Instruktionen
Habe ich eine gepackte Vektor von vier 64-bit-floating-point-Werte.
Ich möchte die Summe der Vektor-Elemente.
Mit SSE (und mit 32-bit floats) konnte ich nur Folgendes tun:
v_sum = _mm_hadd_ps(v_sum, v_sum);
v_sum = _mm_hadd_ps(v_sum, v_sum);
Leider, obwohl AVX verfügt über eine _mm256_hadd_pd Anweisung, es unterscheidet sich im Ergebnis von der SSE-version. Ich glaube, dies ist aufgrund der Tatsache, dass die meisten AVX-Instruktionen arbeiten, als SSE-Anweisungen für jede low-und high-128-bits separat, ohne Sie je überschreiten der 128-bit-Grenze.
Idealerweise die Lösung, die ich Suche, sollten Sie diese Richtlinien befolgen:
1) nur verwenden, AVX/AVX2-Instruktionen. (kein SSE)
2) tun Sie es in nicht mehr als 2-3 Anweisungen.
Jedoch, eine effiziente und elegante Art und Weise, es zu tun (auch ohne die oben genannten Richtlinien) ist immer gut angenommen.
Vielen Dank für jede Hilfe.
-Luigi Castelli
InformationsquelleAutor der Frage Luigi Castelli | 2012-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie zwei
__m256d
Vektorenx1
undx2
enthalten vierdouble
s, die Sie möchten, um horizontal Summe, die man tun könnte:So wie es aussieht 3 Anweisungen müssen 2 von der horizontalen Summen, die Sie brauchen. Das oben ist ungetestet, aber sollte man das Konzept.
InformationsquelleAutor der Antwort Jason R
Wenn Sie möchten, dass nur die Summe, und ein bisschen scalar code wird akzeptiert:
InformationsquelleAutor der Antwort RJVB
Vorausgesetzt, die folgenden, Sie haben eine
__m256d
Vektor mit 4 verpackt verdoppelt, und Sie möchten berechnen die Summe seiner Bestandteile, dha0, a1, a2, a3
ist jedes Doppel-Komponente, die Sie möchtena0 + a1 + a2 + a3
dann heres eine andere AVX Lösung:Diese Lösung hat die Summe ausgestrahlt, die vielleicht nützlich ...
Wenn ich falsch interpretiert-das problem, das ich zu entschuldigen.
InformationsquelleAutor der Antwort Samy Vilar