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 ()?
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.
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.
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.
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 ()?
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.
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.
Tags und Links cuda