OpenCL全局内存

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

1
如果您不发出读/写入队列的命令,那么只要参数正确,它就不会进行任何复制操作。 - huseyin tugrul buyukisik
所以我应该调用clCreateBuffer(context, CL_MEM_READ_WRITE, 30010241024, NULL, NULL)就可以了吗? - Mike
1
我正在为我的流体建模内核做这个,它们都使用许多像这样的临时缓冲区。30010241024*sizeof(cl_float)或者cl_whatever你需要的大小。但是这只适用于单个GPU的使用。对于多个GPU,你需要另一种方式。 - huseyin tugrul buyukisik
谢谢,我会采用这种方法。 - Mike
还有一件事,如果一个缓冲区在多个内核之间共享,那么只有当这些内核都在同一个队列中时,该缓冲区才被认为是同步的。当内核在不同的队列中但共享同一个缓冲区时,你需要显式地进行同步。玩得开心! - huseyin tugrul buyukisik
1个回答

2
如果您只是调用clCreateBuffer而没有使用主机指针,那么会在设备上分配内存,而不会从主机复制任何数据。例如:
buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, size, NULL, &err);

1
但是如果“输入数据”是从主机提供给内核的,那么你最终必须将其复制(如果不是在clCreateBuffer中,则使用clEnqueueWriteBuffer或使用映射)。除非你使用的是集成内存的OpenCL设备,否则通过PCIe进行数据复制是必要的。 - Dithermaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接