2012-03-27 14 views
0

Ich versuche eine Skalierbarkeitsanalyse mit meiner Quadro FX 5800 zu machen, die 240 Cores zu den Laufzeitskalen mit einer Anzahl von Kernen hat, was eine klassische Studie für paralleles Rechnen ist. Ich frage mich, wie passt die Definition des Kerns dazu? Und wie kann ich es verwenden, um auf anderen Kerneinstellungen sagen (8,16,32,64,128,240 Kerne)? Mein Testfall ist die einfache Matrixmultiplikation.Skalierbarkeitsanalyse auf GPU

Antwort

3

Skalierbarkeit auf der GPU sollte nicht in Bezug auf CUDA-Kerne, sondern in Bezug auf SM-Auslastung gemessen werden. IPC ist wahrscheinlich das beste Einzelmaß für die SM-Nutzung. Wenn Sie einen Algorithmus entwickeln, möchten Sie Ihre Arbeit so partitionieren, dass Sie genügend Arbeit an alle SMs verteilen können, sodass der Warp-Scheduler in jedem Zyklus mindestens einen Warp-Befehl hat, der ausgegeben werden kann. Im Allgemeinen bedeutet dies, dass Sie genügend Warps auf jedem SM haben müssen, um die Befehls- und Speicherlatenz zu verbergen und eine Vielzahl von Befehlstypen bereitzustellen, um die Ausführungspipeline zu füllen.

Wenn Sie die Skalierung über CUDA-Kerne testen möchten (bedeutungslos), können Sie Threadblöcke mit 1, 2, 3, ... 32 Threads pro Block starten. Wenn Sie nicht mehrere WARP_SIZE (= 32) Threads pro Threadblock starten, wird nur eine Teilmenge der Kerne verwendet. Dies sind im Grunde vergeudete Ausführungs-Slots.

Wenn Sie die Skalierung in Bezug auf SMs testen möchten, können Sie den Algorithmus von 1 Threadblock auf 1000s Threadblocks skalieren. Um die Skalierung zu verstehen, können Sie die Thread-Blöcke pro SM künstlich begrenzen, indem Sie beim Start den gemeinsamen Speicher pro Thread-Block konfigurieren.

Das Neuschreiben von Matrix-Multiplikationen zur optimalen Skalierung in jeder dieser Richtungen ist wahrscheinlich frustrierend. Bevor Sie dieses Projekt in Angriff nehmen, würde ich Ihnen empfehlen, zu verstehen, wie man eine einfache parallele Berechnung wie das Summieren von 0-100000 oder das Berechnen einer faktoriellen Skalierung über mehrere Thread-Blöcke verteilt. Diese Algorithmen sind nur ein paar Zeilen Code und die oben erwähnte Skalierung kann durch Variation der Startkonfiguration (GridDim, BlockDim, SharedMemoryPerBlock) und Kernel 1-2 Parameter versucht werden. Sie können die verschiedenen Starts mit dem CUDA Profiler, Visual Profiler, Parallel Nsight zeitlich festlegen oder CUvents.

1

Angenommen, Sie verwenden CUDA oder OpenCL als Programmiermodell: Eine einfache Möglichkeit, die Verwendung auf M Anzahl von Multiprozessoren (SM) zu beschränken, ist Ihren Kernel mit einer Ausführungskonfiguration von M Blöcke (von Threads) zu starten. Wenn jeder SM aus N Kernen besteht, können Sie auf diese Weise die Skalierbarkeit über N, 2N, 4N, ... Kerne testen.

Zum Beispiel, wenn die GPU 4 SM hat, jede SM mit 32 Kernen. Durch das Ausführen von Kernen mit 1, 2 und 4 Blöcken verwendet Ihr Kernel 32, 64 und 128 Kerne der GPU.

+0

Meinst du, dass die Anzahl der Blöcke zu Kernen entsprechen? Ich glaube nicht, dass das richtig ist – Mohammed

+0

@ashwin: Das ist nicht korrekt. Auf der betreffenden Karte laufen M-Blöcke auf 8M-Kernen für 1 30. – talonmies

+0

Talonmies: Stimmt das nicht? (A) Ein Block ist auf einen SM beschränkt (kann nicht auf SMs aufgeteilt werden) (B) Wenn 4 Blöcke und 4 SMs vorhanden sind, wird der globale Scheduler einen Block pro SM platzieren? –