2016-03-23 8 views
2

Ich arbeite mit Cloo, einer OpenCL C# -Bibliothek, und ich frage mich, wie ich am besten ermitteln kann, welches Gerät zur Laufzeit für meine Kernel verwendet wird. Was ich wirklich wissen möchte ist, wie viele Kerne ich habe (Recheneinheiten * Kerne pro Recheneinheit) auf GPUs. Wie mache ich das richtig? Ich kann derzeit Recheneinheiten und Häufigkeit bestimmen.OpenCL Auswahl des optimalen Geräts für den Durchsatz

EDIT: Ich habe versucht zu versuchen, auf allen Geräten zu profilieren (führen Sie einen Geschwindigkeitstest) und speichern/vergleichen Sie die Ergebnisse. Aber von meinem Verständnis her stellt dies auch ein Problem dar, da Sie kein Programm schreiben können, das alle Geräte optimal/fair zum Vergleich verwendet.

Dies wäre auch nützlich, um eine optimale Anzahl von Worker-Threads für jeden Kernel-Aufruf festzulegen. Jede Hilfe wird sehr geschätzt.

+0

Wenn Sie mit C# implementieren möchten, hier ist ein guter Beitrag zum Thema: http://stackoverflow.com/questions/1542213/how-to-find-the-number-of-cpu-cores -via-net-c –

+0

Sorry, ich war nicht konkret, ich brauche die Anzahl der Kerne auf einer GPU-Rechnereinheit, damit Environment mir leider nicht helfen wird. – guitar80

Antwort

1

Beurteilung der Leistung durch nur Kernzählung ist sehr schwer. Manche Kerne sind breiter, manche schneller. Selbst wenn sie identisch sind, erschweren Kombinationen aus Registerraum und lokalem Speicher das Erraten noch mehr.

Entweder sollten Sie über eine Datenbank mit jeder Grafikkartenleistung pro Treiber pro Betriebssystem pro Algorithmus verfügen und sie mit der aktuellen Häufigkeit multiplizieren oder sie einfach vor Auswahl- oder Abfrageleistungszeitgebern aller Geräte benchmarken, während sie tatsächlich Beschleunigungsjobs ausführen.

Eine GTX680 und eine HD7950 haben eine ähnliche Anzahl von Kernen, aber einige Algorithmen bevorzugen HD7950 für zusätzliche% 200 Leistung und umgekehrt für einige andere Codes.

Sie können die Anzahl der Kerne nicht abfragen. Sie können die Anzahl der Recheneinheiten und die maximale Anzahl der Threads pro Recheneinheit abfragen, sie sind jedoch nicht mit der Leistung verbunden, es sei denn, sie haben dieselbe Architektur.

Sie können die optimale Thread-Nummer pro Arbeitsgruppe abfragen, aber das kann sich mit dem von Ihnen verwendeten Algorithmus ändern, so dass Sie möglichst viele Werte ausprobieren sollten. Dies gilt auch für vektorisierte Versionen einer Skalarfunktion. Wenn es sich um eine CPU handelt (oder eine andere GPU), kann es 4 oder 8 Zahlen gleichzeitig multiplizieren.

Manchmal Autocompiler-Optimierung Treiber Autofahrer ist so gut wie eine Hand abgestimmt Optimierung.

https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/clGetDeviceInfo.html

+0

Ich war mir bewusst, dass es kein perfekter Test war, aber ich dachte, es könnte nützlich sein, zumindest zu raten. Wie würde ich angemessen ein Benchmark-Programm schreiben, das allen potenziellen Geräten gerecht wird? Ich habe das Gefühl, dass dies das gleiche Problem darstellt. (Es gibt offensichtlich mehr Parameter als nur die rohe Verarbeitungsleistung, die die Leistung bestimmt) – guitar80

+1

Ein Benchmark könnte alle verfügbaren Werte für die Threadgruppengröße (2,4,8,32,64, ..., 1024) durchlaufen und könnte auch angewendet werden Sowohl die vektorisierten (float4, float16) als auch die skalaren (float) Versionen sind in Betracht gezogen. Es gibt viele andere Optionen, aber diese sind die wichtigsten imo. Diese optimalen Werte können auch mit clGetDeviceInfo abgefragt werden. –

+0

Also, ich vergleiche nur, wer bei den meisten Werten der Thread-Gruppengröße besser lief? – guitar80

Verwandte Themen