Memory OpenCL全局存储器

Memory OpenCL全局存储器,memory,opencl,global,Memory,Opencl,Global,我的OpenCL内核需要几MB的输入数据,大约300MB的临时全局内存用于工作,它只返回几MB。我知道给内核这个临时内存的唯一方法是用malloc分配这个内存,然后用clCreateBuffer传递它,但是将300MB复制到GPU需要一些时间,而且还需要300MB的主机RAM。是否可以跳过它,在内核内部分配全局设备内存,或者以某种方式声明一个300Mb的缓冲区,但不使用malloc创建缓冲区,也不将其复制到GPU?如果您只调用clCreateBuffer,而不使用主机指针,那么将在设备上分配内存

我的OpenCL内核需要几MB的输入数据,大约300MB的临时全局内存用于工作,它只返回几MB。我知道给内核这个临时内存的唯一方法是用malloc分配这个内存,然后用clCreateBuffer传递它,但是将300MB复制到GPU需要一些时间,而且还需要300MB的主机RAM。是否可以跳过它,在内核内部分配全局设备内存,或者以某种方式声明一个300Mb的缓冲区,但不使用malloc创建缓冲区,也不将其复制到GPU?

如果您只调用
clCreateBuffer
,而不使用主机指针,那么将在设备上分配内存,而不从主机复制任何数据。例如:

buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, size, NULL, &err);

如果不发出读/写队列,那么如果参数正确,它将不会进行任何复制。因此,我应该调用clCreateBuffer(context,CL_MEM_read_write,300*1024*1024,NULL,NULL),仅此而已?我这样做是为了我的流体建模内核,它们都使用了许多这样的临时缓冲区。300*1024*1024*sizeof(cl_浮点数)或cl_任何您需要的。但这仅适用于单一GPU使用。对于许多GPU,您需要一种不同的方法。谢谢,我将使用这种方法,然后还有一件事,如果内核之间共享一个缓冲区,那么如果两个内核在同一队列中,则称该缓冲区是同步的。当不同队列中的内核共享同一缓冲区时,您可能需要显式同步。但是,如果“输入数据”是从hsot提供给内核的,那么最终您将不得不复制它(如果不是在clCreateBuffer中,则使用clEnqueueWriteBuffer或使用映射)。除非您使用的是集成内存OpenCL设备,否则PCIe上的数据拷贝是游戏的一部分。