天天看點

《CUDA C程式設計權威指南》——2.2節給核函數計時

本節書摘來自華章社群《cuda c程式設計權威指南》一書中的第2章,第2.2節給核函數計時,作者[美] 馬克斯·格羅斯曼(max grossman) ,更多章節内容可以通路雲栖社群“華章社群”公衆号檢視

2.2 給核函數計時

在核心的性能轉換過程中,了解核函數的執行需要多長時間是很有幫助并且十分關鍵的。衡量核函數性能的方法有很多。最簡單的方法是在主機端使用一個cpu或gpu計時器來計算核心的執行時間。在本節,你需要設定一個cpu計時器,并學習使用nvidia分析工具來計算執行時間。第6章将教你如何使用cuda特定的計時程式。

2.2.1 用cpu計時器計時

可以使用gettimeofday系統調用來建立一個cpu計時器,以擷取系統的時鐘時間,它将傳回自1970年1月1日零點以來,到現在的秒數。程式中需要添加sys/time.h頭檔案,如代碼清單2-5所示。

《CUDA C程式設計權威指南》——2.2節給核函數計時
《CUDA C程式設計權威指南》——2.2節給核函數計時
《CUDA C程式設計權威指南》——2.2節給核函數計時

了解自身局限性

在調整執行配置時需要了解的一個關鍵點是對網格和塊次元的限制。線程層次結構中每個層級的最大尺寸取決于裝置。

cuda提供了通過查詢gpu來了解這些限制的能力。在本章的2.4節有詳細的介紹。

對于fermi裝置,每個塊的最大線程數是1 024,且網格的x、y、z三個方向上的次元最大值是65 535。

2.2.2 用nvprof工具計時

自cuda 5.0以來,nvidia提供了一個名為nvprof的指令行分析工具,可以幫助從應用程式的cpu和gpu活動情況中擷取時間線資訊,其包括核心執行、記憶體傳輸以及cuda api的調用。其用法如下。

《CUDA C程式設計權威指南》——2.2節給核函數計時

以上結果的前半部分來自于程式的輸出,後半部分來自于nvprof的輸出。可以注意到,cpu計時器顯示消耗的核心時間為3.26ms,而nvprof顯示消耗的核心時間為2.90ms。在這個例子中,nvprof的結果更為精确,因為cpu計時器測量的時間中包含了來自nvprof附加的時間。

nvprof是一個能幫助你了解在執行應用程式時所花費的時間主要用在何處的強大工具。可以注意到,在這個例子中,主機和裝置之間的資料傳輸需要的時間比核心執行的時間要多。圖2-8所描繪的時間線(未按比例繪制),顯示了在cpu上消耗的時間、資料傳輸所用的時間以及在gpu上計算所用的時間。

《CUDA C程式設計權威指南》——2.2節給核函數計時

對于hpc工作負載,了解程式中通信比的計算是非常重要的。如果你的應用程式用于計算的時間大于資料傳輸所用的時間,那麼或許可以壓縮這些操作,并完全隐藏與傳輸資料有關的延遲。如果你的應用程式用于計算的時間少于資料傳輸所用的時間,那麼需要盡量減少主機和裝置之間的傳輸。在第6章中,你将會學習如何使用cuda流和事件來壓縮計算量和通信量。

比較應用程式的性能将理論界限最大化

在進行程式優化時,如何将應用程式和理論界限進行比較是很重要的。由nvprof得到的計數器可以幫助你擷取應用程式的指令和記憶體吞吐量。如果将應用程式的測量值與理論峰值進行比較,可以判定你的應用程式的性能是受限于算法還是受限于記憶體帶寬的。以tesla k10為例,可以得到理論上的比率:

tesla k10單精度峰值浮點運算次數

745 mhz核心頻率 2 gpu/晶片(8個多處理器 192個浮點單元 32核心/多處理器)* 2 ops/周期=4.58 tflops(flops表示每秒浮點運算次數)

tesla k10記憶體帶寬峰值

2 gpu/晶片 256位 2 500 mhz記憶體時鐘* 2 ddr / 8位/位元組=320 gb/s

指令比∶位元組

4.58 tflops/ 320 gb/s,也就是13.6個指令:1個位元組

對于tesla k10而言,如果你的應用程式每通路一個位元組所産生的指令數多于13.6,那麼你的應用程式受算法性能限制。大多數hpc工作負載受記憶體帶寬的限制。

繼續閱讀