2013-07-11 106 views
2

所以我有一個應用程序,我喜歡使用OpenCL分佈在多臺機器上使用MPI。OpenCL部分緩衝區DMA讀取/寫入

現在,在算法的每次迭代中,我需要同步MPI進程之間的緩衝區,但這裏有一個問題:只有2D緩衝區的邊界需要同步/複製,而不是整個區域。

所以我的問題是,如果有可能與OpenCL的內存映射機制(clEnqueueMapBuffer & clEnqueueUnmapMemObject)讀/寫的只是一個2D緩衝的邊界不觸發整個緩衝區的完整副本。

基本上這隻能在OpenCL使用DMA而不是主機端緩衝區副本時才起作用。所以我的問題是,如果OpenCL支持分立PCIe GPU上的設備緩衝區數據的DMA訪問。如果是的話,在什麼硬件和哪個操作系統上?

回答

3

爲了能夠使用DMA,緩衝區應該位於頁面鎖定的內存中。 AMD和NVIDIA在其編程指南中聲明,在頁面鎖定的內存中有一個緩衝區,它應該使用CL_MEM_ALLOC_HOST_PTR標誌創建。以下是NVIDIA說,在部分其guide:

OpenCL應用3.3.1並沒有對是否存儲 對象在頁面鎖定的內存分配或不直接控制,但他們可以 創建使用對象CL_MEM_ALLOC_HOST_PTR標誌和這樣的對象 是可能被驅動程序分配在頁面鎖定內存中的最佳性能爲 。

注意粗體中的「可能」。

哪個操作系統? NVIDIA不會說操作系統,所以任何操作系統NVIDIA都提供驅動程序(對於AMD來說也是如此)。
哪個硬件?任何有DMA控制器我猜。

我們只寫緩衝器的一部分,你可以看看到function

clEnqueueWriteBufferRect() 

此功能允許寫入緩衝器的2或3D區域。另一種可能性是使用子緩衝區與function創建它們:

clCreateSubBuffer() 

但是沒有與它的2D緩衝的概念。

+0

clEnqueueWriteBufferRect/clEnqueueReadBufferRect似乎是我一直在尋找,謝謝。 –