2016-07-07 32 views
1

Ich bin auf der Suche nach einem AVX-256/512-Code für float4/double4 struct, der die Grundoperationen *, +, /, - skaliert durch Skalar usw. überlastet, um einen schnellen Leistungsschub vom Vektor zu erhalten Operationen in einem Code geschrieben mit float4/double4. OpenCL hat diese Datentypen als intrinsics, aber C++ - Code, der auf dem XeonPhi ausgeführt wird, benötigt neue Implementierungen, die die Vorteile der 512-Bit-SIMD-Einheiten nutzen.AVX float4/double4 struct

+1

Off Thema, und schlecht beraten. Die Verwendung von SIMD-Vektoren als Vektoren ist manchmal vernünftig, aber sehr oft eine schlechte Idee - betrachten Sie Skalarprodukte und Normalisierung, die horizontale Ausführung ist ineffizient. Die Zugabe ist natürlich in Ordnung. Es hängt also davon ab, welche Operationen Sie auf den Vektoren ausführen möchten. – harold

+0

Ich weiß, dass dot-Produkte mit diesem Ansatz schlecht sind. Die Operationen, die ich will, sind *, +, /, -, + =, - =,/=, * =, multiply und dividiere durch Skalar – user1382302

+1

Nun, es ist in Ordnung. Natürlich wird 512-Bit SIMD nicht verwendet, 4 Doppel sind nur 256 Bit – harold

Antwort

1

Was Sie suchen, ist Agner Fog Vector Class Library(VCL). Ich habe das meist verwendet, um die Vektortypen in OpenCL zu ersetzen.

Mit der VCL float4 ist Vec4f und double4 ist Vec4d. Wie OpenCL müssen Sie sich nicht um AVX vs AVX512 kümmern. Wenn Sie Vec8d verwenden und für AVX kompilieren, wird AVX512 mit zwei AVX-Registern emuliert.

Die VCL verfügt über alle gewünschten Operationen wie *,+,/,-,+=,-=,/=,*=, multiply and divide by scalar und viele weitere Funktionen.

Der Hauptunterschied zu OpenCL und der VCL besteht darin, dass OpenCL grundsätzlich einen CPU-Dispatcher erstellt. Während Sie mit der VCL einen CPU-Dispatcher selbst schreiben müssen (er enthält einen Beispielcode, um dies mit Dokumentation zu tun). Die VCL hat Funktionen für SSE2 bis AVX512 optimiert, sodass Sie mehrere verschiedene Befehlssätze gezielt ansprechen können. Es gibt sogar a special version of the VCL für die Knights Corner Xeon Phi.

Eine andere Eigenschaft von OpenCL, die ich vermisse, ist die Syntax für das Permutieren. In OpenCL, um die Reihenfolge der Komponenten von float4 umzukehren, könnten Sie v.wzyx tun, während Sie mit der VCL permute4f<3,2,1,0>(v) tun würden. Ich könnte zu create this syntax with C++ möglich sein, aber ich bin mir nicht sicher.

Mit der VCL, OpenMP und einem benutzerdefinierten CPU Dispatcher habe ich OpenCL auf der CPU weitgehend ersetzt.