OpenCL死锁的可能性

时间:2018-01-29 12:14:01

标签: opencl nvidia

我正在使用全局原子来在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实现是否保证始终有效?

1 个答案:

答案 0 :(得分:3)

  

OpenCL和/或NVidia的OpenCL实现是否可以保证这一点   总是有效吗?

就OpenCL标准而言,这不是保证(类似于CUDA)。现在,在实践中,由于您的特定OpenCL实现,它可能会很好地工作,但请记住标准不保证,因此请确保您了解您的实现执行模型以确保这是安全的,并且此类代码不一定可以在其他符合要求的实现中移植。

  

从理论上讲,如果所有工作组都是同时运行的话,这个算法应该始终有效

OpenCL声明工作组可以按任何顺序运行,不一定是并行运行,甚至不是并发运行。 CUDA有类似的措辞,尽管CUDA 9确实支持一种网格同步的形式。

  

OpenCL规范,3.2.2执行模型:执行内核实例:

     

符合要求的实现可以选择序列化工作组,因此正确的算法不能假定工作组将并行执行。没有安全可移植的方法来同步工作组的独立执行,因为一旦在工作池中,它们就可以按任何顺序执行。