2011-10-23 160 views
1

我有CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE標記創建的緩衝器。我已經在一個內核中使用了它,然後將數據下載(queue.enqueueReadBuffer(...))數據返回到創建緩衝區時的主機內存集。我已經在CPU上修改了這些數據,現在我想在另一個內核中使用它們。 當我已上載(queue.enqueueWriteBuffer)中的數據手動使用非阻塞寫入和用該緩衝液作爲參數然後排隊的內核,它返回CL_OUT_OF_RESOURCES錯誤。阻止寫入就好了。非阻塞寫成有序隊列

爲什麼會發生這種情況?我認爲阻塞/非阻塞版本只控制在enqueueWriteBuffer調用返回後我能使用CPU上的內存,而有序隊列對於內核應該沒有區別。 第二個問題是我是否有上傳手動在所有 - 請問CL_MEM_USE_HOST_PTR意味着數據在被上傳從主機到設備的每一個部分,內核利用緩衝區作爲參數的時間?由於我需要時手動下載數據,上面提到的標誌有沒有什麼優點?

感謝

回答

1

我不能肯定你CL_OUT_OF_RESOURCES錯誤的特定問題。這個錯誤似乎在系統中出現了一些問題,所以你得到的實際錯誤可能是由程序中的其他內容(也許是內核)引起的。

在關於使用CL_MEM_USE_HOST_PTR,你仍然還是要手動上傳數據。 OpenCL規範指出:

此標誌僅在host_ptr不爲NULL時有效。如果指定,它 表明應用程序希望OpenCL實現使用 內存host_ptr引用作爲存儲 對象存儲位。 OpenCL實現可以緩存設備內存中由host_ptr指向的內容緩衝區 。當在設備上執行內核時,可以使用此緩存副本 。

對於某些設備,數據將被緩存在設備內存中。爲了同步你的數據,你將不得不使用一些clEnqueueReadBuffer/clEnqueueWriteBufferclEnqueueMapBuffer/clEnqueueUnmapBuffer。對於獨立的CPU + GPU組合(即獨立GPU卡),我不確定這會對CL_MEM_USE_HOST_PTR有什麼好處,因爲無論如何都會緩存數據。

在閱讀說明書,可能有一些性能優勢,使用clEnqueueMapBuffer/clEnqueueUnmapBuffer,而不是clEnqueueReadBuffer/clEnqueueWriteBuffer,但我沒有測試這對任何真正的設備。

祝你好運!