Ich bin auf der Suche nach einem schnellen Weg, um das Skalarprodukt von Vektoren mit 3 oder 4 Komponenten zu berechnen. Ich habe verschiedene Dinge ausprobiert, aber die meisten Online-Beispiele verwenden eine Reihe von Floats, während unsere Datenstruktur unterschiedlich ist.Fast dot Produkt mit SSE/AVX intrinsics
Wir verwenden Strukturen, die 16 Byte ausgerichtet sind. -Auszug (vereinfachte):
struct float3 {
float x, y, z, w; // 4th component unused here
}
struct float4 {
float x, y, z, w;
}
In früheren Tests (unter Verwendung von SSE4 Skalarprodukt intrinsischer oder FMA) Ich konnte keinen Speedup bekommen, im Vergleich zu dem folgenden regulären C++ Code.
float dot(const float3 a, const float3 b) {
return a.x*b.x + a.y*b.y + a.z*b.z;
}
Tests wurden mit gcc und clang auf Intel Ivy Bridge/Haswell durchgeführt. Es scheint, dass die Zeit, die man benötigt, um die Daten in die SIMD-Register zu laden und sie wieder herauszuziehen, alle Vorteile zunichte macht.
Ich würde einige Hilfe und Ideen schätzen, wie das Punktprodukt mit unseren float3/4-Datenstrukturen effizient berechnet werden kann. SSE4, AVX oder sogar AVX2 ist in Ordnung.
Vielen Dank im Voraus.
Haben Sie das generierte ASM überprüft? Für gcc können Sie die Generierung der ASM-Ausgabe mit dem '' -S''-Schalter einschalten (die Ausgabe wird in das mit '' -o'' angegebene Ziel geschrieben). Was sind deine Kompilierungsmöglichkeiten? Ist es möglich, dass gcc bereits SSE-Code erzeugt? –
Als Faustregel gilt: SSE beschleunigt die Dinge nur, wenn Sie viele Berechnungen durchführen, ohne SSE-Register zu verlassen. Was Sie in Ihrer Dot-Funktion haben, sieht nicht genug aus (und wird auch von Ihren Tests bestätigt). Wenn Sie etwas Größeres haben, das einen Aufruf von dot() beinhaltet (im Idealfall eine Schleife, die dot() tausendmal aufruft und die gesamte Schleife als SSE implementiert werden kann), dann haben Sie eine gute Chance auf eine allgemeine Beschleunigung. –
Es wäre hilfreich, mehr Kontext zu sehen, insbesondere den Code, der 'dot' aufruft. Rufen Sie "Punkt" in einer Schleife, z.für ein Array von 'float3' oder' float4'? –