0

我正在从 openCL 的内核生成硬件模块(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 个工作组的工作项正在执行?

感谢您阅读这篇文章,并为我糟糕的英语感到抱歉。

4

1 回答 1

0

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

于 2012-07-25T22:06:48.387 回答