2013-10-18 101 views
0

如果我理解正確,我可以在爲設備內核執行中的主機內存訪問分配CL緩衝區時使用CL_MEM_USE_HOST_PTR。我可以使用CL_MEM_COPY_HOST_PTR將數據複製到設備內存。我的問題是:我可以以某種方式分配一個數組A,其中一半分配在主機內存中,另一半分配到設備內存中。假設前半部分分配在主機內存中。 A [0〜(N/2-1)]訪問主機存儲器,A [N/2〜(N-1)]訪問設備存儲器。如何在主機內存中分配一半OpenCL緩衝區,另一半分配給設備內存?

回答

0

真實的事實是,你無法知道內存在哪裏

分配的對象內存位於OpenCL「上下文」內,純粹是虛擬的,可以位於任何位置(設備或主機)。 如果您希望從指針中獲取內存,或從指針中複製內存或在主機中分配副本,則只能指定OpenCL。但是,這些都不能保證主機端的內存一致性。也就是說,主機上的內存可能不是該內存對象的最後一個版本。由於OpenCL允許將內存緩存在設備中。

一些供應商指定在其實現和SDK中使用某些標誌來選擇不同類型的內存(即:固定)。但這是依賴於實現的,並且不會改變您仍然需要使用clReadBuffer()或clMapBuffer()來確保主機端的值是內核的實際輸出的事實。

從我個人的經驗來看,如果你不使用沉重的I/O。您可以簡單地使用CL_MEM_READ_WRITE標誌。