提问者:小点点

内核函数内工作项的序列化 - OpenCL


我正在研究从openCL的内核生成hadware模块(Verilog上的描述)。我正在读一篇关于这个的文章,作者对内核做了一些预处理,预处理的第一步是:内核函数内工作项的序列化,他们是这样解释的:

假设在内核函数中不存在同步操作,工作组中的工作项目可以以任何顺序执行。基于这一观察,我们通过将内核函数体中的指令封装到三重嵌套循环中来序列化工作项的执行,假设一个工作组中抽象索引空间的最大维数是三。每个循环嵌套枚举相应维度中的工作项,从而序列化它们的执行。

他们提供了这样一个例子:

int __kernel_indices[3];

__kernel_indices[2] = 0;
while (__kernel_indices[2]< __local_size[2]){
   __kernel_indices[1] = 0;
   while (__kernel_indices[1]< __local_size[1]){
      __kernel_indices[0] = 0;
      while (__kernel_indices[0]< __local_size[0]){

               //Kernel Body

      }
      __kernel_indices[0]++;
   }
   __kernel_indices[]++;
}
__kernel_indices[2]++;

我不理解序列化的含义,一次执行一个工作项吗?或者当时只有一个工作组的工作项正在执行?

感谢您阅读帖子,并为我糟糕的英语道歉。


共1个答案

匿名用户

是的,上面的内核使不同的工作项按顺序执行,而不是一起运行。对我来说,随着 while 循环的运行,越来越多的工作项开始执行。若要理解这一点,请将每个工作项视为具有三维索引。