2012-04-10 7 views
9

OpenCL-Standard definiert die folgenden Optionen, um zu bestimmen Informationen über Gerät zu erhalten und zusammengestellt kernel:Was ist der Algorithmus optimale Arbeitsgruppengröße und Anzahl der Arbeitsgruppe

  • CL_DEVICE_MAX_COMPUTE_UNITS

  • CL_DEVICE_MAX_WORK_GROUP_SIZE

  • CL_KERNEL_WORK_GROUP_SIZE

  • CL_KERNEL_PREFERRED_W ORK_GROUP_SIZE_MULTIPLE

diese Werte gegeben, wie kann ich die optimale Größe der Arbeitsgruppe und Zahl der Arbeitsgruppen berechnen?

Antwort

7

Sie finden diese Werte experimentell für Ihren Algorithmus. Verwenden Sie einen Profiler, um harte Zahlen zu erhalten.

Ich möchte CL_DEVICE_MAX_COMPUTE_UNITS als die Anzahl der Arbeitsgruppen verwenden, da ich oft auf die Synchronisierung von Arbeitsaufgaben angewiesen bin. Ich führe normalerweise Kernel mit wenig Verzweigung, also dauert die Ausführung in jeder Recheneinheit die gleiche Zeit.

Einige Multiple von CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE sind optimal für Ihr Gerät. Was dieses Vielfache tatsächlich ist, hängt von Ihrem Speicherzugriffsmuster und der Art der Arbeit ab, die Sie mit jedem Arbeitselement ausführen. Verwenden Sie 1 als das Vielfache, wenn Sie einen schweren, computergebundenen (ALU) Kernel ausführen. Probieren Sie ein größeres Vielfaches aus, um die Speicherlatenz zu verbergen, wenn Sie durch den Speicherzugriff einen Engpass haben. Verwenden Sie einen Profiler, um zu bestimmen, wann Ihre Zugriffszeit und Ihre ALU-Zeit optimal sind.

Optimale Verhältnis für ALU zu holen ist 1: 1 für jedes Gerät. Dies wird in der Praxis nur selten erreicht, daher möchten Sie die ALU/SIMD-Bänke getränkt halten. Das bedeutet ALU: fetch sollte, wenn möglich, größer als 1 sein. Weniger als 1 bedeutet, dass Sie eine größere Arbeitsgruppengröße ausprobieren sollten, um die Speicherlatenz besser zu verbergen.

+0

Ich möchte eine Reihe von Geräten unterstützen. Bedeutet dies, dass ich meine Kernel auf jedem von ihnen testen muss, um optimale Werte für Kernel-Enqueuing zu erhalten? – Kentzo

+0

Testen Sie Ihren Algorithmus auf den Geräten, auf die Sie Zugriff haben - die Ergebnisse sollten nicht zu sehr variieren. Ich schlage vor, es auf einem Gerät von jeder Hauptarchitektur zu versuchen, die Sie anvisieren möchten. Wenn es Ihnen möglich ist, passen Sie die Parameter zur Laufzeit an, um die Optimierung zu versuchen. Dies könnte die optimalen Werte optimieren, die Sie während der Entwicklung entdeckt haben. Wenn Sie Feedback vom Endbenutzer/Client über die tatsächlichen Hardware-Nummern erhalten, können Sie sich auf die am häufigsten verwendeten Geräte konzentrieren. – mfa

+0

Im Allgemeinen wird die Verwendung von 'CL_DEVICE_MAX_COMPUTE_UNITS' nicht zu optimaler Leistung führen (es sei denn, Sie führen eine große Anzahl von Synchronisationen zwischen Arbeitsgruppen durch, aber das ist normalerweise eine schlechte Idee). Ich würde generell die Dokumentation nach guten Werten fragen, aber ich habe noch nie gesehen, dass mehr Arbeitsgruppen die Leistung beeinträchtigt haben, je mehr desto besser. Beachten Sie, dass der Teil über das Auswählen höherer Arbeitsgruppengrößen zum Ausblenden der Speicherwartezeit (zumindest für GPUS) nur dann wahr ist, wenn Sie nicht genügend Arbeitsgruppen verwenden (wie CL_DEVICE_MAX_COMPUTE_UNITS, da CUs in der Regel mehr als eine Arbeitsgruppe gleichzeitig unterstützen können). – Grizzly

Verwandte Themen