OpenCL常量内存缓存

时间:2012-05-29 07:47:12

标签: memory opencl

如果我执行一个使用一小段常量内存的内核,那么在内核运行时写入该常量内存,内核是否会立即看到更改,或者内核是否已经“缓存”在内核上启动 - 或者OpenCL驱动程序是否无条件地延迟常量内存更新,直到内核完成运行?

如果出现第一个或第三个选项,那么如何同时使用不同的常量内存数据执行相同的内核?我是否需要创建多个内核/常量缓冲区对象并使用它?注意我不能预先计算任何内容,因为内核启动是由任何时间和速率可能发生的外部信号引起的。我也可以动态创建内核对象,但这似乎是一个丑陋的解决方案。

1 个答案:

答案 0 :(得分:3)

这是OpenCL中的一个基本概念,即“排队”到同一命令队列中的命令按顺序执行。这包括WriteBuffer和类似的命令。这意味着如果你这样做

EnqueueNDKernalRange()
EnqueueWriteBuffer()
EnqueueNDKernalRange()

然后,无论它们是阻塞还是非阻塞,写入只会影响第二组内核。

如果您通过映射指针进行更新,则应在任何内核运行之前取消映射。运行访问当前映射的缓冲区的内核是未定义的(规范1.1 - 第5.4.2.1节)。

由于EnqueueMapBufferEnqueUnmapMemObject也放在命令队列中,只要你取消映射更新的顺序仍然有保证。

这是回答你的问题,还是你用另一种方式更新你的缓冲区?

  

如何同时使用不同的常量内存数据执行相同的内核?我是否需要创建多个内核/常量缓冲区对象并使用它?

是的,多个缓冲区对象。