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:Does
    ClenqueueEmapBuffer/ClenqueEmapImage
    也会自动从CPU分配缓冲区。如果有的话。我想管理我的CPU缓冲区。我的意思是我先分配了一个大的缓冲区。如果我需要缓冲。我可以从我首先分配的大缓冲区分配它。如何从大缓冲区生成
    clenqueumapuffer/clenqueumapimage
    alloc缓冲区如果未在随后映射的缓冲区中使用CL_MEM_alloc_HOST_PTR,则会分配主机内存。