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