【发布时间】:2013-12-15 16:43:20
【问题描述】:
我的 OpenCL 内核需要几 MB 的输入数据,大约 300 MB 的临时全局内存用于工作,它只返回几 MB。我知道给内核这个临时内存的唯一方法是用 malloc 分配这个内存,然后用 clCreateBuffer 传递它,但是将 300MB 复制到 GPU 需要一些时间,并且还需要 300MB 的主机 RAM。是否可以跳过它并在内核内部分配全局设备内存或以某种方式声明一个 300Mb 的缓冲区但不使用 malloc 创建它并且不将其复制到 GPU?
【问题讨论】:
-
如果你不发出读/写队列,那么如果参数正确,它就不会做任何复制。
-
所以我应该调用 clCreateBuffer(context, CL_MEM_READ_WRITE, 300*1024*1024, NULL, NULL) 就这样了吗?
-
我正在为我的流体建模内核执行此操作,它们都使用许多像这样的临时缓冲区。 300*1024*1024*sizeof(cl_float) 或 cl_whatever 你需要。但这仅适用于单个 GPU 使用。对于许多 GPU,您需要一种不同的方式。
-
谢谢,那我就用这个方法
-
还有一件事,如果一个缓冲区在内核之间共享,如果两个内核在同一个队列中,则该缓冲区被认为是同步的。当不同的队列内核共享同一个缓冲区时,您可能需要显式同步。玩得开心。