【问题标题】:OpenCL global memoryOpenCL 全局内存
【发布时间】: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,您需要一种不同的方式。
  • 谢谢,那我就用这个方法
  • 还有一件事,如果一个缓冲区在内核之间共享,如果两个内核在同一个队列中,则该缓冲区被认为是同步的。当不同的队列内核共享同一个缓冲区时,您可能需要显式同步。玩得开心。

标签: memory opencl global


【解决方案1】:

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

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

【讨论】:

  • 但是如果“输入数据”是从 hsot 提供给内核的东西,你最终必须复制它(如果不在 clCreateBuffer 中而不是使用 clEnqueueWriteBuffer 或使用映射)。除非您使用的是集成内存 OpenCL 设备,否则通过 PCIe 复制数据是游戏的一部分。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多