問題描述:一般利用CUDA進行加速處理時,都需要測試CUDA程序的運行時間,來對比得到的加速效果.
解決方法:
1).GPU端計時,即設備端計時.
2).CPU端計時,即主機端計時.
設備端計時有兩種不同的方不地,分別是調用clock()函數和使用CUDA API的事件管理功能.
clock函數計時:
1).在內核函數中要測量的一段代碼的開始和結束的位置分別調用一次clock函數,並將結果記錄下來.
2).根據這兩次clock函數返回值,作差計算,然后除以GPU的運行頻率(SP的頻率)即可以得到內核執行時間.
一般只需要記錄每個block執行需要的時間,最后將得到多個block的開始和結束時間,
然后比較這多個開始和結束時間,選擇最小的開始(最早開始的block)時間和最大的結束時間(最晚結束的block),
這兩個時間值作差,除以GPU的運行頻率即可以得到內核執行時間.
CUDA API事件計時:
利用cuda提供的事件管理api實現計時功能.

主機端計時:
利用庫函數里提供函數進行計時,如gettimeofday(),clock()...

注意問題:
1).實際中用得較多的是第二和第三種測時方法.
2).在cpu端測進,一定要了解CUDA API的異步特性,需要時,使用cudaThreadSynchronize()函數進行同步.
3).使用CUDA runtime API時,會在第一次調用runtime API函數時啟動CUDA環境.
為了避免將這一部分時間計入,最好在正式測時開始前先進行一次包含數據輸入輸出的計算,
這樣可以使GPU從平時的節能模式進入工作狀態,使測試結果更加可靠.
