CUDA, wie wählt man Blöcke, Threads?

8

In einer Bibliothek verwende ich Aufrufe an mehrere CUDA-Kernel. Natürlich möchte ich die beste Leistung erzielen. Wie Benutzer die Bibliothek verwenden, kann ein wenig variieren.

Die Anzahl der Blöcke / Threads beeinflusst dies signifikant.

Gibt es eine Regel zur Auswahl von Blöcken / Threads für die beste Leistung?

Zum Beispiel (nur eine Frage), ist es am besten, Blöcke hoch, Threads niedrig zu wählen? Oder umgekehrt? Oder verwenden Sie am besten einige Werte von GetDeviceProperties ()?

    
Torsten Mohr 30.09.2012, 09:06
quelle

3 Antworten

0

Sie können dependency calculator.xls verwenden, das von NVIDIA zur Verfügung gestellt wird, um [die Werte der Threads und Blöcke in xls zu ändern] die beste Konfiguration zu wählen, auf der Sie die beste Besetzung erreichen können, die Ihnen wiederum das Beste gibt Performance.

    
rps 30.09.2012, 10:56
quelle
0

Vorzugsweise möchten Sie mindestens einen vollständigen Warp von Threads in einem Block haben, ansonsten nutzen Sie die verfügbare Verarbeitungsleistung nur schlecht. Außerdem möchten Sie normalerweise eine durch die Warp-Größe gleichmäßige Anzahl von Threads in einem Block haben.

Die Anzahl der zu verwendenden Threads in einem Block hängt von Ihrer Ressourcennutzung ab. Grundsätzlich möchten Sie eine große Belegung anstreben. Die Grenzen werden durch verfügbaren gemeinsamen Speicher und Register gesetzt. Wenn Sie viel geteilten Speicher und / oder Register verwenden, sinkt die maximal erreichbare Belegung. Es macht dann Sinn, die Anzahl der Threads pro Block zu profilieren und feinabzustimmen, bis ein Sweetspot gefunden ist, wo das Verhältnis der erreichten und theoretischen Belegung maximiert wird, und natürlich auch die Gesamtbelegung selbst so nahe wie möglich bei 100% liegt / p>

Als Faustregel gilt, dass Sie die Anzahl der Gewinde pro Block maximieren und gleichzeitig eine gute Belegung beibehalten möchten. Es macht in einem Profilierungsschritt durchaus Sinn, automatisch durch die Menge möglicher Block- / Garnnummernkombinationen zu iterieren, um die Extremalkombination zu finden.

    
datenwolf 30.09.2012 09:15
quelle
0
___ answer12660107 ___

Vorzugsweise möchten Sie mindestens einen vollständigen Warp von Threads in einem Block haben, ansonsten nutzen Sie die verfügbare Verarbeitungsleistung nur schlecht. Außerdem möchten Sie normalerweise eine durch die Warp-Größe gleichmäßige Anzahl von Threads in einem Block haben.

Die Anzahl der zu verwendenden Threads in einem Block hängt von Ihrer Ressourcennutzung ab. Grundsätzlich möchten Sie eine große Belegung anstreben. Die Grenzen werden durch verfügbaren gemeinsamen Speicher und Register gesetzt. Wenn Sie viel geteilten Speicher und / oder Register verwenden, sinkt die maximal erreichbare Belegung. Es macht dann Sinn, die Anzahl der Threads pro Block zu profilieren und feinabzustimmen, bis ein Sweetspot gefunden ist, wo das Verhältnis der erreichten und theoretischen Belegung maximiert wird, und natürlich auch die Gesamtbelegung selbst so nahe wie möglich bei 100% liegt / p>

Als Faustregel gilt, dass Sie die Anzahl der Gewinde pro Block maximieren und gleichzeitig eine gute Belegung beibehalten möchten. Es macht in einem Profilierungsschritt durchaus Sinn, automatisch durch die Menge möglicher Block- / Garnnummernkombinationen zu iterieren, um die Extremalkombination zu finden.

    
___ qstntxt ___

In einer Bibliothek verwende ich Aufrufe an mehrere CUDA-Kernel. Natürlich möchte ich die beste Leistung erzielen. Wie Benutzer die Bibliothek verwenden, kann ein wenig variieren.

Die Anzahl der Blöcke / Threads beeinflusst dies signifikant.

Gibt es eine Regel zur Auswahl von Blöcken / Threads für die beste Leistung?

Zum Beispiel (nur eine Frage), ist es am besten, Blöcke hoch, Threads niedrig zu wählen? Oder umgekehrt? Oder verwenden Sie am besten einige Werte von GetDeviceProperties ()?

    
___ tag123cuda ___ CUDA ist eine parallele Rechenplattform und ein Programmiermodell für Nvidia GPUs (Graphics Processing Units). CUDA bietet eine Schnittstelle zu Nvidia-GPUs über eine Vielzahl von Programmiersprachen, Bibliotheken und APIs. ___ answer18457188 ​​___

Ich denke, es ist eine vollkommene Erfahrung.

Die Block- und Rastergröße hängt von vielen Dingen ab, wie zB Algorithmus, Arbeit pro Thread, Ressource, Latenz.

Im Normalfall mache ich zuerst 256 * 256. und passen Sie es häufig an, um ein besseres zu wählen.

Beim Schub werden sie eine Blockgröße wie 257 wählen, um Bankkonflikte zu vermeiden.

Es gibt eine Menge Ressourcen, die Ihnen bei der Auswahl helfen. mögen: Latenz und Blockgröße ( Ссылка )

Wie auch immer, versuchen Sie es einfach und aktualisieren Sie es.

    
___ answer12660684 ___

Sie können dependency calculator.xls verwenden, das von NVIDIA zur Verfügung gestellt wird, um [die Werte der Threads und Blöcke in xls zu ändern] die beste Konfiguration zu wählen, auf der Sie die beste Besetzung erreichen können, die Ihnen wiederum das Beste gibt Performance.

    
___ qstnhdr ___ CUDA, wie wählt man Blöcke, Threads? ___
luxuia 27.08.2013 04:50
quelle

Tags und Links