2012-05-07 47 views
0

我正在一個大陣列上運行一個內核。當我剖析clEnqueueNDRange命令時,執行時間(結束開始)爲.001毫秒,但提交和開始(啓動 - 提交)之間的時間大約爲120毫秒,這隨輸入數據的大小而變化。提交命令直到開始執行時會發生什麼情況。得到這麼長時間是否合理?在OpenCL中提交和開始時間之間的很長時間

+0

你的clEnqueueNDRange調用之後有什麼需要內核的結果嗎?例如,內核之後是否存在阻塞clEnqueueMapBuffer?如果沒有,實現可能會決定延遲內核的執行。 – boiler96

+0

是的,我有兩個clEnqueueReadBuffer後讀取結果,但我不能讀取非阻塞調用的結果。另外clEnqueueMapBuffer似乎有一些問題,給我錯誤的結果。無論如何,是否有可能通過非阻塞呼叫讀取數據? – Damoon

回答

0

OpenCL以異步方式運行。也就是說,當你要求完成一項工作時,可能不會在那個時候發生。它將在未來某個時候發生。這有點奇怪,特別是當你開始分析事物時,但是它的工作原理是這樣的,CPU可以爲OpenGL設備排隊工作,然後在工作完成時去做其他事情。

例如:

clEnqueueWriteBuffer(blah); 
clEnqueueNDRange(blah); 
clEnqueueReadBuffer(blah, but blocking_read = CL_TRUE); 

這裏,writeBuffer和NDRange可能會出現需要非常少量的時間。他們所要做的就是記錄需要做的事情。阻塞的readBuffer將需要很長時間,因爲它必須等待讀取結果。爲了完成這個讀操作,寫操作和內核執行必須在讀操作開始之前完成。

現在讀取的數據可能非常小,但是因爲在完成顯示所需的時間之前它正在等待所有數據取決於之前的命令中的工作量。

我不太明白你在測量你的問題,但我期望你看到的是這個效果。由於他們必須等待以前的工作才能完成,因此其他職能正在被收取。

知道哪些函數會導致CPU在GPU上等待是編寫高性能代碼的一大竅門。任何時候當你引入這樣的等待時,CPU都會停止做任何有用的工作,並且在CPU準備下一個工作時GPU可能會閒置。有時候,別無選擇,你只能等待。

相關問題