天天看點

CUDA實踐指南(九)

帶寬:

帶寬 - 資料可以傳輸的速率 - 是性能最重要的門控因素之一。 代碼的幾乎所有變化都應該在它們如何影響帶寬的情況下進行。 帶寬可能會因資料存儲的記憶體選擇,資料布局方式以及通路順序以及其他因素而受到顯着影響。

要準确測量性能,計算理論和有效帶寬非常有用。 當後者遠低于前者時,設計或實作細節可能會降低帶寬,并且應該成為後續優化工作的主要目标。

高優先級:在衡量性能和優化優勢時,使用計算的有效帶寬作為度量标準。

理論帶寬計算:

理論帶寬可以使用産品文獻中提供的硬體規格進行計算。 例如,NVIDIA Tesla M2090使用GDDR5(雙倍資料速率)RAM,存儲器時鐘頻率為1.85 GHz,存儲器接口為384位。

使用這些資料項,NVIDIA Tesla M2090的最高理論記憶體帶寬為177.6 GB / s

$(1.85times10^{9}times(384/8)times2)div10^{9}=177.6GB/s

$

在此計算中,由于雙倍資料速率,存儲器時鐘速率被轉換為Hz,乘以接口寬度(除以8,将位轉換為位元組)并乘以2。 最後,此産品除以$10^{9}$以将結果轉換為GB / s。

一些計算使用$1024^3$而不是$10^9$進行最終計算。 在這種情況下,帶寬将達到165.4GB / s。 計算理論和有效帶寬時使用相同的除數很重要,以便比較有效。

啟用ECC後,由于記憶體校驗和的額外流量,有效最大帶寬減少了大約20%,但ECC對帶寬的确切影響取決于記憶體通路模式。

有效帶寬計算:

有效帶寬是通過定時特定的程式活動以及了解程式如何通路資料來計算的。 為此,請使用以下等式:

$Effective bandwidth=((B_{r}+B_{w})\div10^{9})\div time$

這裡,有效帶寬以GB / s為機關,$B_{r}$是每個核心讀取的位元組數,$B_{w}$是每個核心寫入的位元組數,時間以秒為機關。

例如,要計算2048 x 2048矩陣副本的有效帶寬,可以使用以下公式:

$Effective bandwidth=((2048^{2}\times4\times2)\div 10^{9})\div time$

元素數量乘以每個元素的大小(浮點數為4個位元組)乘以2(因為讀取和寫入),再除以$10^{9}$(或$1,024^3$)以獲得傳輸的記憶體GB。 這個數字除以獲得GB / s的秒數。

吞吐量由Visual Profiler報告:

對于計算能力為2.0或更高的裝置,Visual Profiler可用于收集多個不同的記憶體吞吐量度量。 以下吞吐量名額可顯示在“詳細資訊”或“詳細資訊圖”視圖中:

Requested Global Load Throughput

Requested Global Store Throughput

Global Load Throughput

Global Store Throughput

DRAM Read Throughput

DRAM Write Throughput

請求的全局負載吞吐量和請求的全局存儲吞吐量值訓示核心請求的全局記憶體吞吐量,是以對應于有效帶寬計算下顯示的計算所獲得的有效帶寬。

由于最小記憶體事務大小大于大多數字大小,是以核心所需的實際記憶體吞吐量可能包括未被核心使用的資料傳輸。 對于全局記憶體通路,此實際吞吐量由全局負載吞吐量和全局存儲吞吐量值報告。

請注意,這兩個數字都很有用。 實際的記憶體吞吐量顯示了代碼與硬體限制有多接近,并且将有效或請求的帶寬與實際帶寬進行比較,可以很好地估計由于存儲通路次優聯合而浪費了多少帶寬。 對于全局記憶體通路,請求記憶體帶寬與實際記憶體帶寬的比較由全局記憶體負載效率和全局記憶體存儲效率度量标準報告。