2013-12-21 137 views
0

我想了解使用CUDA定時器(事件)的定時內核執行與常規CPU定時方法(Linux上的gettimeofday等)之間的區別。CUDA計時器 - CPU與GPU?

從閱讀http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/第8.1節看來,唯一真正的區別是,當使用CPU定時器時,需要記住同步GPU,因爲調用是異步的。據推測,CUDA事件API會爲你做這件事。

所以這是真的的問題:

  1. 隨着你並不需要顯式調用cudaDeviceSynchronize
  2. 隨着GPU的事件你會得到一個固有的平臺無關的時機API的GPU事件,而與CPU您需要根據操作系統使用單獨的API

在此先感謝

回答

2

你已經記下了。由於GPU與CPU異步操作,當您啓動GPU內核時,CPU可以繼續其快樂的方式。在計時時,這意味着您可以在GPU從其內核返回之前達到計時代碼的末尾(即記錄持續時間)。這就是爲什麼我們要同步......以確保內核在我們繼續使用CPU代碼之前完成。當我們需要來自GPU內核的結果進行後續操作(即算法中的步驟)時,這一點尤爲重要。

如果有幫助,您可以將cudaEventSynchronize視爲CPU-GPU的同步點,因爲CPU定時器取決於CPU和GPU代碼,而cuda定時器事件僅取決於GPU代碼。而且由於那些cuda時序事件是由nvcc專門爲CUDA平臺編譯的,所以它們獨立於CPU平臺,但依賴於GPU平臺。

+3

一般來說,我同意你的回答,我同意OP的概念基本正確。但我不確定我是否同意這一說法:「而cuda計時器事件只依賴於GPU代碼」。至少在Linux上,我可以將cuda定時器事件封裝在純粹爲主機代碼的代碼中(除了cudaEvents定時機制外,我的程序中甚至不需要任何CUDA),並且它似乎準確定位了主機代碼的持續時間,從我可以告訴。因此,在我看來,cudaEvents將用於超時的CPU和GPU代碼。 –

+0

好點。似乎你不是唯一一個被發現是真實的人。看到相關的SO問題[這裏](http://stackoverflow.com/a/5846331/832648)。 – Justin