2011-04-29 81 views
8

使用CPU定時器CUDA計時器事件來測量執行某些CUDA代碼所用的時間有什麼區別? CUDA程序員應該使用哪些應用程序?爲什麼?CUDA:CPU定時器和CUDA定時器事件之間的區別?

CPU定時器的使用將涉及在任何時間被記錄之前調用cudaThreadSynchronize。注意可以使用clock()的時間,或者可以查詢像QueryPerformanceCounter(在Windows上)的高分辨率性能計數器。

CUDA計時器事件將涉及使用cudaEventRecord之前和之後的記錄。在稍後的時間,將通過對事件調用cudaEventSynchronize獲得經過的時間,然後通過cudaEventElapsedTime獲得經過的時間。

+0

你是否開始寫一個問題並完成另一個寫作?我不明白最後一段如何適合問題的其餘部分。你真的想知道什麼?你是否試圖協調主機和設備定時器測量的輸出,不能或者其他? – talonmies 2011-04-29 06:52:39

+0

Talonmies:我刪除了最後一段。所以問題就是......作爲一名程序員,我很困惑這兩個計時器中的哪一個要使用,爲什麼? – 2011-04-29 07:12:14

回答

9

第一部分問題的答案是cudaEvents計時器基於GPU上的高分辨率計數器,並且它們比使用主計時器具有更低的延遲和更好的分辨率,因爲它們「脫離金屬」。您應該期待cudaEvents計時器獲得亞微秒分辨率。正是出於這個原因,你應該更喜歡它們來計時GPU操作。 cudaEvents的per-stream特性對於處理同步內核執行和重疊副本和內核執行等異步操作也很有用。使用主機定時器進行這種時間測量幾乎是不可能的。

編輯:我不會回答最後一段,因爲你刪除它。

+0

Talonmies:你能詳細說明「重複拷貝和內核」是什麼意思嗎?爲什麼使用CPU來測量它是不可能的? – 2011-04-29 07:15:08

+2

@Ashwin:所有與CUDA兼容的GPU在過去3年左右發售,支持同時執行主機<->設備複製和內核執行。但要做到這一點,需要cudaMemcpy API的異步版本,並且因爲它們與主機是異步的,所以無法在不強制調用同步的情況下對這些操作進行檢測,並停止重疊。因此,您可以使用主機定時器測量完全重疊的複製執行操作,但無法解決開始和結束時間之間發生的情況。但是將事件插入到流中,您可以。 – talonmies 2011-04-29 07:27:39

3

使用CUDA事件進行計時的主要優點是,由於其他系統事件(如分頁或磁盤或網絡控制器的中斷),它們不易受到干擾。此外,由於cu(da)EventRecord是異步的,因此在計算短時間的GPU密集型操作時,海森堡效應會減少。

CUDA事件的另一個優點是它們有一個乾淨的跨平臺API - 無需包裝gettimeofday()或QueryPerformanceCounter()。

最後一個注意事項:在使用流式CUDA事件進行計時時要小心 - 如果不指定NULL流,則可能會結束您不打算執行的計時操作。在CUDA事件和讀取CPU時間戳計數器(這是一個序列化指令)之間有很好的類比。在現代超標量處理器上,序列化語義使得時序明確無誤。同RDTSC一樣,您應該始終將需要時間的事件包含在時間上,因爲時間有意義(就像您不能使用RDTSC來有意義地計算單個機器指令一樣)。