10

谁能谈谈函数的clEnqueueMapBuffer工作机制。其实我主要关心我能从这个功能中获得什么速度上的好处clEnqueueRead/WriteBuffer

PS:是否clEnqueueMapBuffer/clEnqueueMapImage也会自动从 CPU 分配缓冲区?如是。
我想管理我的 CPU 缓冲区。我的意思是我首先 malloc 一个大缓冲区。然后,如果我需要缓冲区。我可以从我首先分配的大缓冲区中分配它。如何clEnqueueMapBuffer/clEnqueueMapImage从大缓冲区中分配缓冲区。

4

2 回答 2

6

clEnqueueMapBuffer/clEnqueueMapImage

用于访问内存对象而不是使用clEnqueueRead/的 OpenCL 机制Write。我们可以将设备上的内存对象映射到主机上的内存区域。一旦我们映射了对象,我们就可以按照我们喜欢的方式读/写或修改。

Read/ Writebuffer 和之间的另一个区别clEnqueueMapBuffermap_flags参数。如果map_flags设置为CL_MAP_READ,映射内存将是只读的,如果它设置为CL_MAP_WRITE映射内存将是只写的,如果你想要同时读取 + 写入,则制作标志CL_MAP_READ | CL_MAP_WRITE

相比读/写fns,内存映射需要三步流程>

  1. 使用 映射内存clEnqueueMapBuffer
  2. 通过 将内存从设备传输到主机/从主机传输memcpy
  3. 使用 取消映射clEnqueueUnmapObject

人们普遍认为,与常规读/写相比,内存映射显着提高了性能,请参见此处:什么更快 - AMD devgurus 论坛链接

如果要复制图像或图像的矩形区域,则也可以使用clEnqueueMapImagecall 。

参考:

于 2012-09-04T03:01:12.053 回答
-1

不,地图函数不分配内存。您可以在调用 clCreateBuffer 时这样做。如果您在 CPU 上分配内存然后尝试使用它,则需要将其复制到 GPU 可访问内存。要让两者都可以访问内存,最好使用 CL_MEM_ALLOC_HOST_PTR

clCreateBuffer(context, flags, size, host_ptr, &error);

context - 您正在使用的设备的上下文。

标志 - CL_MEM_ALLOC_HOST_PTR | CL_MEM_READ_WRITE

size - 缓冲区大小(以字节为单位),通常为 N * sizeof(data type)

host_ptr - Can be NULL or 0 meaning we have no existing data. You could add CL_MEM_COPY_HOST_PTR to flags and pass in a pointer to the values you want copied to the buffer. This would save you having to copy via the mapped pointer. Beneficial if the values won't change.

于 2014-03-26T09:56:07.597 回答