Opencl是否可以在内核之间运行缓存一些数据?

Is it possible for Opencl to cache some data while running between kernels?

我目前有一个问题场景,我正在执行图形计算任务,我总是需要在主机端更新我的顶点数据,迭代计算以获得结果。但在这个过程中,关于边的数据是不变的。我想知道有没有什么办法可以使用OpenCL重复写入数据,运行内核,读取数据,可以将一些不变的数据保存在设备端,减少通信成本。顺便说一句,我目前只能运行 OpenCL 1.2.


问题 1:

Opencl 是否可以在运行内核之间缓存一些数据


,在OpenCL编程模型中是可以的。请查看 OpenCL 官方文档中的 Buffer Objects, Image Objects and Pipes。主机可以使用 OpenCL API 调用来操作缓冲区对象。

此外,以下 OpenCL Whosebug 帖子将进一步阐明您关于 OpenCL 中缓存的概念:

  • OpenCL execution strategy for tree like dependency graph

  • OpenCL Buffer caching behaviour

  • Memory transfer between host and device in OpenCL?

并且您需要检查缓存技术,例如 OpenCL 中的 double buffering


问题 2:

想知道有没有办法可以用OpenCL反复写数据,运行内核,读数据,可以把一些不变的数据保存在设备端降低通信成本


,有可能。您可以通过批处理或数据平铺来完成。因为作为与每次传输相关的开销,批处理很多小 转移到一个更大的转移中比每个转移的表现要好得多 单独转让。可以有许多批处理或数据平铺的示例。一根拐杖是这样的: OpenCL Kernel implementing im2col with batch


其他:


  • 如果可以,请使用最新版本的OpenCL。版本 1.2 是旧的。
  • 由于您没有提到,FPGA 和 GPU 等硬件加速器之间的编程模型可能有所不同。