2013-12-15 106 views
0

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

+1

如果您不发出读/写入队队列,那么如果参数是正确的,它将不会执行任何复制。 –

+0

所以我应该调用clCreateBuffer(上下文,CL_MEM_READ_WRITE,300 * 1024 * 1024,NULL,NULL),这是全部? – Mike

+1

我为我的流体建模内核做了这些,他们都使用了很多像这样的临时缓冲区。 300 * 1024 * 1024 * sizeof(cl_float)或cl_w您需要的任何内容。但这只适用于单GPU使用。对于许多GPU,你需要一种不同的方式。 –

回答

2

如果您只是在不使用主机指针的情况下致电clCreateBuffer,则内存将在设备上分配,而不从主机复制任何数据。例如:

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

但是,如果“输入数据”是从hsot提供给内核的东西,那么最终必须复制它(如果不是在clCreateBuffer中比使用clEnqueueWriteBuffer或使用映射)。除非您使用集成内存OpenCL设备,否则PCIe上的数据副本是游戏的一部分。 – Dithermaster