我最近比較了兩種做內核運行時測量的問題,並且看到了一些令人困惑的結果。OpenCL AMD AMD GPU時間測量問題
我使用集成了GPU和Ubuntu Linux的AMD Bobcat CPU(E-350)(CL_PLATFORM_VERSION
是OpenCL 1.2 AMD-APP (923.1)
)。
基本理念的gettimeofday看起來像這樣:
clFinish(...) // that all tasks are finished on the command queue
gettimeofday(&starttime,0x0)
clEnqueueNDRangeKernel(...)
clFlush(...)
clWaitForEvents(...)
gettimeofday(&endtime,0x0)
這是說的內核需要大約5466毫秒。
第二次測量我做了clGetEventProfilingInfo
爲QUEUED
/SUBMIT
/START
/END
。
隨着4個時間值我可以計算出在不同狀態下的時間花費:
- 時間花在排隊:0.06毫秒,
- 花費的時間提交:2733毫秒,在執行
- 時間花:2731毫秒(實際執行時間)。
我發現它總計達5466毫秒,但爲什麼它一直停留在提交狀態一半?
而且有趣的事情是:
提交的狀態始終的實際執行時間的一半,甚至是不同的內核或不同的工作負載(所以它不可能是一個常數設置時間),
的CPU在提交狀態的時間花費爲0,執行時間等於gettimeofday的結果,
我測試我在英特爾的Ivy Bridge內核使用CPU和GPU的窗戶和我不」你看那裏的影響。
有沒有人有線索?
我懷疑是GPU運行內核兩次(導致gettimeofday實際執行時間的兩倍),或者函數clGetEventProfilingInfo對於AMD GPU不能正常工作。
您是否向設備發送任何數據?您也可能測量了一些I/O時間。嘗試減少傳輸的數據量,或者只是禁用clEnqueueWriteBuffer以查看它如何改變您的測量。 –
我發送了一些數據到設備,但是我在運行內核之前執行了它,並且在測量之前clFinish(...)應該完成隊列中的所有任務。我也用CL_TRUE進行數據複製,直到數據被傳輸爲止。 – Tomas
編輯說明:您需要閱讀,我們如何在這裏格式化帖子。你的格式非常糟糕!您將HTML與Markdown混合使用。我們在這裏使用** Markdown **。我剛剛清除了你的問題,但這肯定是一項艱鉅的任務。很多爛攤子... – trejder