好吧, 因此,我正在CPU上進行一些計算,然後將數字傳輸到GPU並在那裏做一些工作。我想計算在CPU + GPU上執行計算所花費的總時間。我該怎麼做?如何計算CPU + GPU的總時間
回答
當您的程序啓動時,在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()),併除以迭代次數。
無論GPU是否工作,C計時器都會繼續運行。如果你不相信我,那麼做一下這個小實驗:在GPU_Function_Call上用1000次迭代在循環上製作一個。圍繞該循環放置任何C計時器。現在,當你運行這個程序時(假設GPU函數需要20ms的時間),你會在它返回之前用肉眼看到它運行幾秒鐘。但是當你打印C時,你會注意到它會顯示你幾毫秒。這是因爲C計時器沒有等待1000 MemcpyHtoD和1000 MemcpyfromDtoH和1000內核調用。
我的建議是使用CUDA事件計時器甚至更好NVIDIA視覺探查時間GPU和使用秒錶(增加迭代以減少人爲誤差)來測量完成時間。然後只需從GPU中減去GPU時間即可獲得CPU時間。
你的第一點並不完全正確。是的,內核啓動是異步的,但標準的mempcpy API是阻塞的,所以主機定時器會記錄正確的掛鐘時間。 – talonmies
- 1. 解釋如何計算CPU時間
- 2. 如何同時使用GPU和CPU計算?
- 3. CUDA計時器 - CPU與GPU?
- 4. 計算CPU執行時間
- 5. 如何計算總的行駛時間
- 6. GPU上的Tensorflow matmul計算比CPU上的計算速度慢
- 7. 測量準確的GPU計算時間
- 8. 計算總CPU使用率
- 9. cpu vs gpu - CPU好時
- 10. 計算總時間Sharepoint 2007
- 11. 計算時間總和
- 12. 計算總工作時間
- 13. CacheSQL計算總時間
- 14. 計算總秒從時間
- 15. PHP計算總時間
- 16. 如何計算GPU負載
- 17. 如何計算和僅有時間戳的總時間長度?
- 18. 計算時間間隔的總秒數
- 19. 使用MPI計算CPU時間
- 20. 如何計算CPU的計算成本與發送數據到GPU的成本+執行計算+獲取數據?
- 21. CPU使用情況如何計算?
- 22. 如何計算兩個日期之間的總工作時間
- 23. 如何計算不是我的用戶的CPU使用總和
- 24. MDX計算所有時間的計算總計
- 25. 即使關機後CPU如何計算系統時間?
- 26. Prolog - 計算旅行的總時間
- 27. 計算ios/cocos2d的總暫停時間
- 28. 計算花費時間的總和
- 29. 計算下載數據的總時間?
- 30. 常見算法的GPU與CPU性能
這些系統定時器是否也考慮在GPU上進行計算所需的時間?我不這麼認爲......之間,我想要一段代碼。因此,只是在主要啓動沒有幫助 – Programmer
@Programmer請檢查我的編輯。 – Patrick87