Opencl ARM Mali-如何在CPU和GPU之间同时共享只读内存对象?

Opencl ARM Mali-如何在CPU和GPU之间同时共享只读内存对象?,opencl,mali,Opencl,Mali,我使用的是ARM Mali T604 GPU。我使用ALLOC_HOST_PTR创建了一个内存对象。我想知道以下程序是否有效?我可以同时访问(只读)GPU中的内存对象和映射(只读)CPU中的相同内存对象吗 步骤1:取消映射内存对象(以前映射为CL\u MAP\u READ\u WRITE) 步骤2:使用CL_map_READ(参数到clEnqueueMapBuffer())将内存对象映射回 步骤3:CPU和GPU同时读取和处理数据(但我不会对这个内存对象执行任何写操作) 步骤4:取消映射内存对象

我使用的是ARM Mali T604 GPU。我使用ALLOC_HOST_PTR创建了一个内存对象。我想知道以下程序是否有效?我可以同时访问(只读)GPU中的内存对象和映射(只读)CPU中的相同内存对象吗

步骤1:取消映射内存对象(以前映射为CL\u MAP\u READ\u WRITE)

步骤2:使用CL_map_READ(参数到clEnqueueMapBuffer())将内存对象映射回

步骤3:CPU和GPU同时读取和处理数据(但我不会对这个内存对象执行任何写操作)

步骤4:取消映射内存对象

步骤5:使用CL_map_READ_WRITE将内存对象映射到主机


换句话说,我最终的目标是拥有一个CPU和GPU同时可读的内存对象。这在马里OpenCL平台上可行吗?

不仅在马里GPU上可行,在任何版本的OpenCL规范和平台/设备上都可行,您的方法是正确的,并且与OpenCL 1.0兼容

但是,您应该知道内存存在双重性(主机正在访问通过映射操作生成的本地副本,而不是真实的GPU数据),因此,如果您是有意这样做的话,您没有通过以OpenCL缓冲区格式保存阵列来节省内存


例如:如果在映射时从内核写入该内存,CPU仍将读取旧数据,直到您再次取消映射以进行读取。

在OpenCL规范1.2中
5.4.3访问内存对象的映射区域

命令队列中的多个命令可以映射内存对象和相关内存对象(子缓冲区对象或与此区域重叠的1D图像缓冲区对象)的区域或重叠区域以进行读取(即
map\u flags=CL\u map\u READ
)。映射用于读取的内存对象区域的内容也可以由内核和在设备上执行的其他OpenCL命令(例如
clEnqueueCopyBuffer
)读取