it-swarm.com.de

CUDA: Wie viele gleichzeitige Threads insgesamt?

Ich habe eine GeForce GTX 580 und möchte eine Aussage über die Gesamtzahl der Threads machen, die (idealerweise) tatsächlich parallel ausgeführt werden können, um sie mit 2 oder 4 Multi-Core-CPUs zu vergleichen.

deviceQuery gibt mir die folgenden möglicherweise relevanten Informationen: 

CUDA Capability Major/Minor version number:    2.0
(16) Multiprocessors x (32) CUDA Cores/MP:     512 CUDA 
Maximum number of threads per block:           1024

Ich glaube, ich habe gehört, dass jeder CUDA-Kern einen Warp parallel ausführen kann und dass ein Warp 32 Threads umfasst. Wäre es richtig zu sagen, dass die Karte dann 512 * 32 = 16384 Threads parallel ausführen kann, oder bin ich weit weg und die CUDA-Cores laufen irgendwie nicht wirklich parallel?

41
Eskil

Die GTX 580 kann gleichzeitig 16 * 48 Warps (jeweils 32 Threads) ausführen. Das sind 16 Multiprozessoren (SMs) * 48 residente Warps pro SM * 32 Threads pro Warp = 24.576 Threads.

Verwechseln Sie nicht Parallelität und Durchsatz. Die obige Anzahl ist die maximale Anzahl von Threads, deren Ressourcen gleichzeitig auf dem Chip gespeichert werden können - die Anzahl, die resident sein kann. In CUDA ausgedrückt nennen wir dieses Maximum auch Belegung. Die Hardware wechselt ständig zwischen Warps, um die (große) Latenz von Speicherzugriffen sowie die (kleine) Latenz arithmetischer Pipelines zu verdecken oder zu "verstecken". 

Während jeder SM 48 residente Warps haben kann, kann er bei jedem Taktzyklus nur Befehle aus einer kleinen Anzahl (im Durchschnitt zwischen 1 und 2 für die GTX 580, aber abhängig vom Programmbefehlsmix) von Warps ausgeben. 

Daher ist es wahrscheinlich besser, den Durchsatz zu vergleichen, der von den verfügbaren Ausführungseinheiten und der Leistungsfähigkeit der Hardware für mehrere Ausgaben bestimmt wird. Beim GTX580 gibt es 512 FMA-Ausführungseinheiten, aber auch Ganzzahleinheiten, Spezialfunktionseinheiten, Speicherbefehlseinheiten usw., die doppelt ausgegeben werden können (d. H. Unabhängige Anweisungen von zwei Warps gleichzeitig ausgeben) in verschiedenen Kombinationen. 

Die Berücksichtigung all dieser Punkte ist jedoch zu schwierig. Daher vergleichen die meisten Menschen zwei Messgrößen: 

  1. Peak-GFLOP/s (für GTX 580 sind dies 512 FMA-Einheiten * 2 Flops pro FMA * 1544e6 Zyklen/Sekunde = 1581,1 GFLOP/s (einfache Genauigkeit))
  2. Gemessener Durchsatz in der Anwendung, an der Sie interessiert sind.

Der wichtigste Vergleich wird immer an einer realen Anwendung gemessen.

57
harrism

Es gibt bestimmte Traps, auf die Sie durch den Vergleich mit 2- oder 4-Kern-CPUs stoßen können:

  • Die Anzahl der gleichzeitigen Threads stimmt nicht mit der Anzahl der Threads überein, die tatsächlich parallel ausgeführt werden. Natürlich können Sie 24576-Threads gleichzeitig auf der GTX 580 starten, aber der optimale Wert ist in den meisten Fällen niedriger.

  • Eine 2- oder 4-Kern-CPU kann beliebig viele gleichzeitige Threads haben! Ähnlich wie bei der GPU wird das Hinzufügen weiterer Threads ab einem bestimmten Punkt nicht helfen oder sogar verlangsamen.

  • Ein "CUDA-Kern" ist eine einzelne Skalarverarbeitungseinheit, während der CPU-Kern normalerweise eine größere Sache ist und beispielsweise eine 4-breite SIMD-Einheit enthält. Um Äpfel mit Äpfeln zu vergleichen, sollten Sie die Anzahl der angekündigten CPU-Kerne mit 4 multiplizieren, um dem zu entsprechen, was NVIDIA als Kern bezeichnet.

  • Die CPU unterstützt Hyperthreading, wodurch ein einzelner Kern 2 Threads gleichzeitig auf einfache Weise verarbeiten kann. Aus diesem Grund kann ein Betriebssystem tatsächlich zweimal so viele logische Kerne wie die Hardwarekerne sehen.

Fazit: Für einen fairen Vergleich kann Ihre 4-Core-CPU aufgrund von SIMD und Hyperthreading tatsächlich 32 "skalare Threads" gleichzeitig ausführen.

9
CygnusX1

Ich weiß, dass dies ein bisschen spät ist, aber ich dachte mir, dass ich trotzdem helfen würde. Ab Seite 10 das Whitepaper CUDA Fermi architecture:

Jedes SM verfügt über zwei Warp-Scheduler und zwei Befehlsverteiler, so dass zwei Warps gleichzeitig ausgegeben und ausgeführt werden können.

Für mich bedeutet dies, dass auf jedem SM 2 * 32 = 64 Threads gleichzeitig ausgeführt werden können. Ich weiß nicht, ob dies bedeutet, dass die GPU insgesamt 16 * 64 = 1024 Threads gleichzeitig ausführen kann.

0
Mitch