天天看點

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

本節書摘來自華章計算機《cuda c程式設計權威指南》一書中的第2章,第2.2節,作者 [美] 馬克斯·格羅斯曼(max grossman),譯 顔成鋼 殷建 李亮,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

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

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

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

你可以用cpusecond函數來測試你的核函數:

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

由于核函數調用與主機端程式是異步的,你需要用cudadevicesynchronize函數來等待所有的gpu線程運作結束。變量ielaps表示程式運作的時間,就像你用手表記錄的核函數的執行時間(用秒計算)。

現在,通過設定資料集大小來對一個有16m個元素的大向量進行測試:

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

由于gpu的可擴充性,你需要借助塊和線程的索引來計算一個按行優先的數組索引i,并對核函數進行修改,添加限定條件(i<n)來檢驗索引值是否越界,如下所示:

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

有了這些更改,可以使用不同的執行配置來衡量核函數。為了解決建立的線程總數大于向量元素總數的情況,你需要限制核心不能非法通路全局記憶體,如圖2-7所示。

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

代碼清單2-5展示了如何在主函數中用cpu計時器測試向量加法的核函數。

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

預設的執行配置被設定為一個包含16 384個塊的一維網格,每個塊包含1 024個線程。用以下指令編譯并運作程式:

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

在基于英特爾sandy bridge架構的系統上進行測試,從代碼清單2-5的示例中可以看出,在gpu上進行的向量加法的運算速度是在cpu上運作向量加法的3.86倍。

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

把塊的次元減少到512可以建立32 768個塊。在這個新的配置下,核心的性能提升了1.19倍。

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

如果進一步将塊的次元降低到256,系統将提示以下錯誤資訊,資訊表示塊的總數超過了一維網格的限制。

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

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

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

可以使用以下指令擷取更多關于nvprof的幫助資訊:

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

你可以用如下指令去測試核心:

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

nvprof的輸出結果會因你使用的gpu類型不同而有所差異。以下結果是從tesla gpu中得到的:

《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流和事件來壓縮計算量和通信量。

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

繼續閱讀