Opencl 克伦奎埃马布弗是如何工作的
有人能谈谈克伦奎埃马布弗的工作机制吗。实际上,我主要关心的是,与Opencl 克伦奎埃马布弗是如何工作的,opencl,Opencl,有人能谈谈克伦奎埃马布弗的工作机制吗。实际上,我主要关心的是,与clenqueuered/WriteBuffer相比,这个函数在速度上有什么好处 PS: clEnqueueMapBuffer/clEnqueueMapImage是否也自动从CPU分配缓冲区? 如果是。 我想管理我的CPU缓冲区。我的意思是,我首先需要一个大的缓冲区。如果我需要缓冲。我可以从我首先分配的大缓冲区中分配它。如何使clenqueumpauffer/clenqueumpapimage从大缓冲区分配缓冲区。clenqueum
clenqueuered/WriteBuffer相比,这个函数在速度上有什么好处
PS:
clEnqueueMapBuffer/clEnqueueMapImage
是否也自动从CPU分配缓冲区?
如果是。
我想管理我的CPU缓冲区。我的意思是,我首先需要一个大的缓冲区。如果我需要缓冲。我可以从我首先分配的大缓冲区中分配它。如何使clenqueumpauffer/clenqueumpapimage
从大缓冲区分配缓冲区。clenqueumpauffer
/clenqueumpapimage
用于访问内存对象而不是使用clenqueuread
/Write
的OpenCL机制。我们可以将设备上的内存对象映射到主机上的内存区域。一旦我们映射了对象,我们就可以随意读/写或修改
Read
/Write
缓冲区和clEnqueueMapBuffer
之间的另一个区别是map\u flags
参数。如果map\u flags
设置为CL\u map\u READ
,则映射内存将是只读的,如果设置为CL\u map\u WRITE
则映射内存将是只读的,如果您想同时读取和写入,则将标记设置为CL\u map\u READ | CL\u map\u WRITE
与读/写FN相比,内存映射需要三步过程>
使用clEnqueueMapBuffer
映射内存
通过memcpy
将内存从设备传输到主机
使用clenqueunmapobject
取消映射
人们普遍认为,与常规读/写相比,内存映射在性能上有了显著提高,请参见此处:
如果要复制图像或图像的矩形区域,也可以使用clenqueumapimage
调用
参考资料:
否,映射功能不分配内存。您可以在调用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添加到标志中,并传入一个指向要复制到缓冲区的值的指针。这将节省您通过映射指针进行复制的时间。如果值不变,则有益。@ockuser:DoesClenqueueEmapBuffer/ClenqueEmapImage
也会自动从CPU分配缓冲区。如果有的话。我想管理我的CPU缓冲区。我的意思是我先分配了一个大的缓冲区。如果我需要缓冲。我可以从我首先分配的大缓冲区分配它。如何从大缓冲区生成clenqueumapuffer/clenqueumapimage
alloc缓冲区如果未在随后映射的缓冲区中使用CL_MEM_alloc_HOST_PTR,则会分配主机内存。