如果我执行一个使用一小块常量内存的内核,然后在内核运行时写入该常量内存,内核是立即看到更改,还是在内核启动时将常量内存的内容“缓存”-或者OpenCL驱动程序是否无条件地延迟常量内存更新,直到内核运行完毕?
如果出现第一个或第三个选项,那么如何使用不同的常量内存数据同时执行相同的内核?我需要创建多个内核/常量缓冲区对象并使用它吗?注意,我不能预先计算任何东西,因为内核启动是外部信号的结果,这些外部信号可以在任何时间和速率发生。我也可以即时创建内核对象,但这似乎是一个丑陋的解决方案。
发布于 2012-05-29 16:20:45
这是OpenCL中的一个基本概念,即“入队”到同一命令队列的命令是按顺序执行的。这包括WriteBuffer和类似的命令。这意味着如果你这样做了
EnqueueNDKernalRange()
EnqueueWriteBuffer()
EnqueueNDKernalRange()那么不管它们是阻塞的还是非阻塞的,写操作只会影响第二组内核。
如果你是通过一个映射指针来更新的,那么在运行任何内核之前,都应该取消映射。访问当前映射的缓冲区的运行内核未定义(规范1.1 -第5.4.2.1节)。
因为EnqueueMapBuffer和EnqueUnmapMemObject也被放在命令队列中,所以只要取消映射,更新的顺序仍然是有保证的。
这是否回答了你的问题,或者你正在以另一种方式更新你的缓冲区?
如何使用不同的常量内存数据同时执行同一内核?我需要创建多个内核/常量缓冲区对象并使用它吗?
是的,多个buffer对象。
https://stackoverflow.com/questions/10795031
复制相似问题