2012-10-28 13 views
3

我寫了一個簡單的CUDA內核來執行大小爲2^18的兩列向量的SAXPY。爲什麼使用少於最大的線程會讓我的內核運行速度更快?

我發現我的GPU(特斯拉C2070)每塊最多可以運行1024個線程。因此,我將我的塊大小設爲X = 1024,Y = 1,Z = 1。我還將網格大小設爲X = 2^18/1024,Y = 1,Z = 1。我這樣做是因爲我想確保每個塊的每個線程都被使用了。

然而,我發現,運行與X = 512的塊大小的內核和X = 128一致,導致更快的時間比X = 1024

這是爲什麼塊大小運行的內核?如果我的塊大小小於1024,我不是在浪費線程嗎?

回答

3

Level 1像SAXPY這樣的BLAS函數是內存帶寬受限的。操作

y <- alpha * x + y 

只執行一個FMAD,但需要兩次加載和全局內存中的存儲。您的C2070具有約37.5Gfloat/s的全局內存帶寬和500 GFMAD/s的單精度算術吞吐量。所以性能取決於內存控制器,而不是ALU。通常減少內存帶寬受限內核中每塊的線程數可以提高性能,因爲它可以減少對內存控制器和緩存資源的爭用並提高帶寬利用率。

這可能是您的SAXPY內核發生的情況。您應該能夠通過基準測試找到最佳的塊大小,但我的經驗是,它將在Fermi設備(如C2070)上每塊128-384個線程。

1

對於使用共享內存來緩存讀取/寫入/數據共享的代碼,較小的塊大小可能會導致每個線程使用較大的共享內存塊,從而增加良好內存訪問模式的機會(更多合併)。

我同意talonmies,根據我的經驗,每塊128-192個線程幾乎總能爲我的代碼帶來最佳性能,即使可以啓動更多的線程。

相關問題