clEnqueueMapBuffer是如何工作的

时间:2012-09-04 01:31:21

标签: opencl

任何人都可以谈论函数clEnqueueMapBuffer工作机制。实际上我主要关注的是我可以通过clEnqueueRead/WriteBuffer从这个函数获得的速度有什么好处。

PS clEnqueueMapBuffer/clEnqueueMapImage是否也自动从CPU分配缓冲区? 如果是的话。
我想管理我的CPU缓冲区。我的意思是我首先将malloc放在一个大缓冲区。如果我需要缓冲区。我可以从我先分配的大缓冲区中分配它。如何从大缓冲区中创建clEnqueueMapBuffer/clEnqueueMapImage分配缓冲区。

2 个答案:

答案 0 :(得分:6)

clEnqueueMapBuffer / clEnqueueMapImage

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

Read / Write缓冲区和clEnqueueMapBuffer之间的另一个区别是map_flags参数。如果map_flags设置为CL_MAP_READ,则映射内存将是只读的,如果设置为CL_MAP_WRITE,则映射内存将只写,如果您同时需要读取+写入制作国旗CL_MAP_READ | CL_MAP_WRITE

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

  1. 使用clEnqueueMapBuffer映射内存。
  2. 通过memcpy将内存从设备传输到主机或从主机传输。
  3. 使用clEnqueueUnmapObject取消映射。
  4. 人们普遍认为,与常规读/写相比,内存映射可以显着提高性能,请参见此处:what's faster - AMD devgurus forum link

    如果您想复制图片或矩形图片区域,那么您也可以使用clEnqueueMapImage来电。

    参考文献:

答案 1 :(得分:-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(数据类型)

host_ptr - 可以为NULL或0表示我们没有现有数据。您可以将CL_MEM_COPY_HOST_PTR添加到标志,并传入指向要复制到缓冲区的值的指针。这将节省您必须通过映射指针进行复制。如果价值不会改变,那将是有益的。