0

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

第 1 步:取消映射内存对象(之前映射为 CL_MAP_READ_WRITE)

第 2 步:使用 CL_MAP_READ 将内存对象映射回(clEnqueueMapBuffer() 的参数)

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

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

第 5 步:使用 CL_MAP_READ_WRITE 将内存对象映射到主机。

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

4

2 回答 2

0

这不仅在 Mali GPU 中是可能的,在任何版本的 OpenCL 规范和平台/设备中都是可能的,您的方法是正确的,并且与 OpenCL 1.0 兼容。

但是您应该知道存在内存重复(主机正在访问通过映射操作生成的本地副本,而不是真正的 GPU 数据),因此您不会通过以 OpenCL 缓冲区格式保存数组来节省内存,如果那是你的意图。

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

于 2014-06-11T19:02:31.923 回答
0

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

命令队列中的多个命令可以映射内存对象和相关内存对象(与该区域重叠的子缓冲区对象或一维图像缓冲区对象)的区域或重叠区域以供读取(即map_flags = CL_MAP_READ)。为读取而映射的内存对象区域的内容也可以由在设备上执行的内核和其他 OpenCL 命令(例如clEnqueueCopyBuffer)读取。

于 2016-06-03T06:34:47.910 回答