/ / Wie bereite ich große Datenmengen für Vektoranweisungen (OpenCL) vor? - opencl, gpgpu, Vektorisierung, Speicherzugriff

Wie bereitet man große Datenmengen für Vektorinstruktionen (OpenCL) auf? - opencl, gpgpu, Vektorisierung, Speicherzugriff

Ich mache parallele Datenverarbeitung in OpenCL undIch möchte den Durchsatz durch Verwendung von Vektoranweisungen (SIMD) erhöhen. Um int4, double2 usw. zu verwenden, muss ich die Eingabedatenfelder kämmen. Was ist der beste Weg, dies zu tun?

Von

A[0] A[1] A[2] ... A[N] B[0] B[1] B[2] ... B[N] C[0]...C[N] D[0]...D[N]

als ein kombinierter Puffer oder separate

Zu

A[0] B[0] C[0] D[0] A[1] B[1] C[1] D[1] ... A[N] B[N] C[N] D[N]

N könnte so groß wie 20000 sein, verdoppelt sich im Moment. Wenn GCN GPGPU verwendet wird, ist die bevorzugte Doppelvektorgröße 2.

-Soll ich einen anderen Kernel vorbereiten, der die Daten für eine bestimmte Vektorbreite kämmt?

- Ich vermute, die CPU würde das selbe machen.

Antworten:

0 für die Antwort № 1

Je nach Gerät erhalten Sie möglicherweise keinen Gewinn, wenn Sie die Vektoren in Ihrem OpenCL C-Code erneut verwenden.

In AMDs Hardware der Vorgängergeneration (VLIW4 / 5)Sie können Gewinne durch Verwendung von Vektoren (wie Float4) erzielen, da dies die einzige Verwendung der Vektorhardware war. Die neue Hardware (GCN) von AMD ist jedoch skalierbar, und der Compiler skaliert Ihren Code. Gleich wie NVIDIA-Hardware, die schon immer skalar war.

Selbst bei der CPU, die SSE / AVX-Vektoranweisungen verwenden kann, skalieren die Compiler Ihren Code und führen dann mehrere Arbeitselemente über Vektorbahnen aus (automatische Vektorisierung).

Probieren Sie also zuerst ein Beispiel aus, bevor Sie sich die Zeit nehmen, alles zu vektorisieren.

Sie können sich stattdessen darauf konzentrieren, dass der Speicherzugriff vollständig vereinigt wird. das ist normalerweise ein größerer Gewinn.