任何人都可以谈论函数clEnqueueMapBuffer
工作机制。实际上我主要关注的是我可以通过clEnqueueRead/WriteBuffer
从这个函数获得的速度有什么好处。
PS :
clEnqueueMapBuffer/clEnqueueMapImage
是否也自动从CPU分配缓冲区?
如果是的话。
我想管理我的CPU缓冲区。我的意思是我首先将malloc放在一个大缓冲区。如果我需要缓冲区。我可以从我先分配的大缓冲区中分配它。如何从大缓冲区中创建clEnqueueMapBuffer/clEnqueueMapImage
分配缓冲区。
答案 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相比,内存映射需要三步过程>
clEnqueueMapBuffer
映射内存。memcpy
将内存从设备传输到主机或从主机传输。clEnqueueUnmapObject
取消映射。人们普遍认为,与常规读/写相比,内存映射可以显着提高性能,请参见此处: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添加到标志,并传入指向要复制到缓冲区的值的指针。这将节省您必须通过映射指针进行复制。如果价值不会改变,那将是有益的。