我正在使用ARM Mali T604 GPU。我使用ALLOC_HOST_PTR创建了一个内存对象。我想知道以下程序是否有效?我可以同时访问(只读)GPU中的内存对象并同时映射(作为只读)CPU中的相同内存对象吗?
步骤1:取消映射内存对象(以前映射为CL_MAP_READ_WRITE)
步骤2:使用CL_MAP_READ(clEnqueueMapBuffer()的参数)将内存对象映射回来
步骤3:同时通过CPU和GPU读取和处理数据(但我不会对此内存对象执行任何写操作)
第4步:取消映射内存对象
步骤5:使用CL_MAP_READ_WRITE将内存对象映射到主机。
换句话说,我在一天结束时的目标是拥有一个可由CPU和GPU同时读取的内存对象。这可能在Mali OpenCL平台上吗?
答案 0 :(得分:0)
不仅可以在Mali GPU中实现OpenCL规范和平台/设备的任何版本,您的方法是正确的,并且与OpenCL 1.0兼容。
但是你应该知道存在内存重复(主机正在访问通过map操作生成的本地副本,而不是真正的GPU数据),因此你不是通过以OpenCL缓冲区格式保存数组来保存内存,如果这是你的意图。
作为示例:如果在映射时从内核写入内存,CPU仍会读取旧数据,直到您再次取消映射/映射以进行读取。
答案 1 :(得分:0)
在OpenCL规范1.2中 5.4.3访问内存对象的映射区域
命令队列中的多个命令可以映射存储器对象的区域或重叠区域以及相关的存储器对象(子缓冲区对象或与该区域重叠的1D图像缓冲区对象)以进行读取(即map_flags = CL_MAP_READ
)。映射用于读取的内存对象的区域内容也可以由在设备上执行的内核和其他OpenCL命令(例如clEnqueueCopyBuffer
)读取。