2012-01-20 144 views
1

好吧, 因此,我正在CPU上進行一些計算,然後將數字傳輸到GPU並在那裏做一些工作。我想計算在CPU + GPU上執行計算所花費的總時間。我該怎麼做?如何計算CPU + GPU的總時間

回答

0

當您的程序啓動時,在main()中,使用任何系統計時器記錄時間。當程序在main()的底部結束時,使用相同的系統計時器記錄時間。取出時間2和時間1之間的差異。你走了!

您可以使用不同的系統計時器,其中一些具有比其他更高的分辨率。而不是在這裏討論這些,我建議你在SO網站上搜索「系統計時器」。如果你只是想要任何系統定時器,gettimeofday()可以在Linux系統上工作,但它已被更新的,更高精度的函數取代。實際上,gettimeofday()僅測量微秒的時間,這應該足以滿足您的需求。

如果無法獲得具有足夠分辨率的定時器,請考慮多次在循環中運行程序,計算循環的執行時間,並將測量的時間除以循環迭代次數。

編輯:

系統計時器可被用於測量總的應用性能,包括GPU計算期間使用的時間。請注意,以這種方式使用系統定時器僅適用於實時或掛鐘時間,而不適用於處理時間。基於掛鐘時間的測量必須包括等待GPU操作完成的時間。

如果要測量GPU內核所用的時間,則有幾個選項。首先,您可以使用Compute Visual Profiler來收集各種分析信息,雖然我不確定它是否報告時間,但它必須能夠(這是一種基本的分析功能)。其他剖析器 - PAPI讓人想起 - 提供對CUDA內核的支持。

另一種選擇是使用CUDA事件記錄時間。請參閱CUDA 4.0編程指南,其中討論瞭如何使用CUDA事件來測量時間。

另一種選擇是使用圍繞GPU內核調用的系統定時器。請注意,考慮到內核調用返回的異步性質,您還需要使用主機端GPU同步調用(如cudaThreadSynchronize())來執行內核調用,以使此方法適用。如果你使用這個選項,我強烈建議在一個循環中調用內核,在最後對循環進行計時+一次同步(因爲在內核調用之間發生的同步不在不同流中執行,循環內部不需要cudaThreadSynchronize()),併除以迭代次數。

+0

這些系統定時器是否也考慮在GPU上進行計算所需的時間?我不這麼認爲......之間,我想要一段代碼。因此,只是在主要啓動沒有幫助 – Programmer

+0

@Programmer請檢查我的編輯。 – Patrick87

0

無論GPU是否工作,C計時器都會繼續運行。如果你不相信我,那麼做一下這個小實驗:在GPU_Function_Call上用1000次迭代在循環上製作一個。圍繞該循環放置任何C計時器。現在,當你運行這個程序時(假設GPU函數需要20ms的時間),你會在它返回之前用肉眼看到它運行幾秒鐘。但是當你打印C時,你會注意到它會顯示你幾毫秒。這是因爲C計時器沒有等待1000 MemcpyHtoD和1000 MemcpyfromDtoH和1000內核調用。

我的建議是使用CUDA事件計時器甚至更​​好NVIDIA視覺探查時間GPU和使用秒錶(增加迭代以減少人爲誤差)來測量完成時間。然後只需從GPU中減去GPU時間即可獲得CPU時間。

+0

你的第一點並不完全正確。是的,內核啓動是異步的,但標準的mempcpy API是阻塞的,所以主機定時器會記錄正確的掛鐘時間。 – talonmies