2010-11-18 2 views
1

Es gab Profilierungszähler in cudaprof für globales Gedächtnis (gst_coherent, gst_incoherent, gld_coherent, gld_incoherent), die nützlich und klar für mich waren, weil sie mir sagten, wie viele nichtkoaleszierte globale Lese- und Schreibvorgänge Ich hatte.CUDA Profiling (Interpretieren von gst/gld Anfragen)

Nun scheint es nur "gst Anfragen" und "gld Anfragen" zu geben. Dies sind die gesamten Ladungen/Speicher pro Warp auf mp 0. Wie kann ich feststellen, ob ich unkoaleszierte Lese-/Schreibvorgänge habe? Ich vermute, dass es weniger Anfragen geben würde, wenn die Anfragen zusammengeführt würden. Soll ich herausfinden, wie viele ich pro Thread erwarte und vergleiche? Leider ist mein Kernel dafür zu dynamisch.

Antwort

1

Die kohärenten/inkohärenten Zähler sind auf sm_10/sm_11-Geräten relevant, wo Zugriffe ausgerichtet und zusammengeführt werden mussten, um pathologische Leistung zu vermeiden. Auf sm_12 und sm_13 versucht die Hardware, soweit möglich, in Segmenttransaktionen Zugriffe zu koaleszieren, und auf sm_2x stellt der L1-Cache eine ähnliche Funktion mit der zusätzlichen Verschiebung des Cache bereit, wenn dies nicht möglich ist.

Idealerweise haben Sie ein Gefühl dafür, wie viele Daten Sie lesen und schreiben, und vergleichen Sie dies mit der erreichten Leistung, dies gibt Ihnen eine Vorstellung von der Effizienz. Da Ihr Kernel jedoch sehr datenabhängig ist, sollten Sie sich einige der Präsentationen von GTC2010 ansehen, um die anderen im Profiler verfügbaren Informationen zu verstehen. Ich würde die Fundamental Performance Optimizations for GPUs Rede empfehlen und, was noch wichtiger ist, aber im Anschluss an die erste, die Analysis-Driven Performance Optimization Rede.

Sie könnten auch erwägen, Ihren Code manuell mit ein paar zusätzlichen Zählern zu instrumentieren.

+0

Diese sehen wie eine ausgezeichnete Quelle aus. Ich werde auch einige meiner eigenen Zähler einbauen - das wird mir helfen, die Profilerausgabe zu verstehen. – jmilloy

+0

Sind bei 2.0-GPUs L1-Cache-Misses in irgendeiner Weise "verschmolzen"? Ist es möglich, dass 2.0 globale Lesevorgänge langsamer als 1.0 globale Lesevorgänge enden, wenn viele Fehler auftreten? Ich denke, ich muss mehr auf die Veränderungen im globalen Speicherzugriff zwischen meiner alten und meiner neuen GPU eingehen! – jmilloy

+0

Auf sm_2x holt die Hardware eine Cache-Zeile bei einem Miss, was dasselbe bewirkt. Sie können den L1-Cache auch umgehen. Weitere Informationen zu beiden Modi finden Sie im CUDA-Programmierhandbuch. – Tom