我自己編寫了CUDA內核。 與CPU代碼相比,我的內核代碼比CPU快10倍。如何評估CUDA性能?
但我對我的實驗有疑問。
我的程序是否完全使用所有GPU核心進行了優化,正確的共享內存使用,足夠的寄存器數量,足夠的佔用率?
如何評估我的內核代碼的性能?
理論上如何計算CUDA的最大吞吐量?
我對CPU的GFLOPS和GPU的GFLOPS和GFLOPS速率之間的比較是透明的理論性能嗎?
在此先感謝。
我自己編寫了CUDA內核。 與CPU代碼相比,我的內核代碼比CPU快10倍。如何評估CUDA性能?
但我對我的實驗有疑問。
我的程序是否完全使用所有GPU核心進行了優化,正確的共享內存使用,足夠的寄存器數量,足夠的佔用率?
如何評估我的內核代碼的性能?
理論上如何計算CUDA的最大吞吐量?
我對CPU的GFLOPS和GPU的GFLOPS和GFLOPS速率之間的比較是透明的理論性能嗎?
在此先感謝。
我的程序是否完全使用所有GPU核心進行了優化,使用了合適的共享內存,足夠的寄存器數量,足夠的佔用率?
要找出這一點,請使用CUDA分析器之一。請參閱How Do You Profile & Optimize CUDA Kernels?
如何從理論上計算CUDA的最大吞吐量?
這個數學稍微有點牽扯,每個架構都不一樣,容易出錯。最好在芯片規格中查看數字。 Wikipedia上有表格,例如this one, for the GTX500 cards。例如,從表中可以看出,GTX580的理論峯值帶寬爲192.4GB/s,計算吞吐量爲1581.1GFLOP。
我說的比較CPU的GFLOPS和GPU的GFLOPS和GFLOPS的比率是否對他們來說是透明的理論表現?
如果我理解正確,您是問GPU上的理論峯值GFLOP數量是否可以直接與CPU上的相應數字進行比較。在比較這些數字時需要考慮以下幾點:
舊的GPU不支持雙精度(DP)浮點,只有單精度(SP)。
與SP相比,支持DP的GPU可以顯着降低性能。我上面引用的GFLOP號碼是針對SP的。另一方面,CPU引用的數字通常用於DP,並且CPU上SP和DP的性能差異較小。
CPU引用可以用於僅在使用SIMD(單指令,多數據)向量化指令時才能實現的速率,並且通常很難編寫接近理論最大值的算法(並且它們可能必須寫入在組裝中)。有時,CPU引用是通過不同類型的指令提供的所有計算資源的組合,並且通常幾乎不可能編寫可同時利用它們的程序。
GPU引用的速率假設您有足夠的並行工作來飽和GPU,並且您的算法沒有帶寬限制。
性能的首選衡量標準是經過時間。 GFLOP可以用作比較方法,但由於指令集,編譯器代碼生成和FLOP計數方法的差異,編譯器和體系結構之間的比較往往很困難。
最好的方法是定時應用程序的性能。對於CUDA代碼,您應該計算每次啓動時會發生的所有代碼。這包括內存拷貝和同步。
Nsight Visual Studio Edition和Visual Profiler爲每個操作提供最準確的度量。 Nsight Visual Studio Edition爲每個設備提供理論帶寬和FLOP值。另外,實現FLOPs實驗可用於捕獲單精度和雙精度的FLOP計數。
我使用經過的時間來檢查CPU和GPU的性能。我的問題是CPU和GPU之間的差異率是10倍。但是我能說10倍(率)是最好的表現嗎?如果是,爲什麼?如果否,爲什麼?這是我的問題.. – 2012-08-21 01:15:54
謝謝,羅傑。你的評論對我有好處。 – 2012-08-12 11:29:01
我有額外的問題。 假設 CPU:2.8GHz的,1個核心 GPU:1.6GHz的,384芯(GTX 560的Ti規格) 在這個例子中,CPU的預期性能是2.8GHz的X 1芯= 2.8GHz的·核心 GPU的預期性能是0.8GHz x 384核心= 307.2 Ghz·核心 此計算是有效的? – 2012-08-12 11:30:04
您無法以GHz爲單位測量性能。爲了找到理論性能,你必須找出CPU/GPU在每個時鐘週期內可以做些什麼。我之前提到的考慮因素會影響您可以獲得的表現。例如,如果您正在查看英特爾Sandy Bridge的性能,則必須考慮到它有一個稱爲AVX的指令集,可以按指令執行8個SP操作。 – 2012-08-12 14:45:13