我正在使用全局原子来在OpenCL中的工作组之间进行同步。
所以内核使用像
这样的代码$('.grid-tab > li > a').on('click', function(e) {
e.preventDefault();
$(this).closest('.grid-tab > li').toggleClass('active-li')
.siblings('.grid-tab > li').removeClass('active-li');
});
等到... global volatile uint* counter;
if(get_local_id(0) == 0) {
while(*counter != expected_value);
}
barrier(0);
变为counter
。
在另一个地方
expected_value
理论上,如果所有工作组都是连续运行的,那么算法应始终有效。但是如果一个工作组只在另一个工作组完全启动后启动,那么内核就会死锁。
在CPU和GPU(NVidia CUDA平台)上,似乎总是有效,有大量工作组(超过8000个)。
对于算法,这似乎是最有效的实现。 (它对2D缓冲区中的每一行进行前缀求和。)
OpenCL和/或NVidia的OpenCL实现是否保证始终有效?
答案 0 :(得分:3)
OpenCL和/或NVidia的OpenCL实现是否可以保证这一点 总是有效吗?
就OpenCL标准而言,这不是保证(类似于CUDA)。现在,在实践中,由于您的特定OpenCL实现,它可能会很好地工作,但请记住标准不保证,因此请确保您了解您的实现执行模型以确保这是安全的,并且此类代码不一定可以在其他符合要求的实现中移植。
从理论上讲,如果所有工作组都是同时运行的话,这个算法应该始终有效
OpenCL声明工作组可以按任何顺序运行,不一定是并行运行,甚至不是并发运行。 CUDA有类似的措辞,尽管CUDA 9确实支持一种网格同步的形式。
OpenCL规范,3.2.2执行模型:执行内核实例:
符合要求的实现可以选择序列化工作组,因此正确的算法不能假定工作组将并行执行。没有安全可移植的方法来同步工作组的独立执行,因为一旦在工作池中,它们就可以按任何顺序执行。