OpenCL 2维工作项目顺序?

时间:2015-07-07 23:15:09

标签: c opencl

我有一个大规模的二维数组,我正在进行计算(在X中的512行中为4.3bil(32位无符号整数))我尝试使用openCL加速。

我显然不能同时做到这一点,所以我尝试了二维工作组设置。

每个"列",其中43亿,其中一行数学和位旋转产生下一行。所以我可以动态生成所有值。

但是由于当前工作行上方的行必须已经设置了一个值,我需要确保当工作组启动时,该组"上面的"已经完成了。彼此相邻的群体并不重要 - 列不会与其他列互动。

工作组是如何解雇的?在X上,然后将X重置为0并将Y递增1?随机跳跃?是否有任何押韵或理由?

并且工作组可以被告知要等到上面的小组“#39;它已经完成了?

我知道我的下一个,上面,下面,行,列在二维数组编程意义上是没有意义的,但它帮助我至少可视化问题。

如果我可以确保团队不会超前,我可以让它发挥作用。只是不确定如何。

我知道有些围栏确保其他工作项目已经赶上

1 个答案:

答案 0 :(得分:0)

在OpenCL中的内核调用中,无法在工作组之间进行同步。如果需要跨多个工作组进行全局内存同步,则需要将多个内核排入队列。

如果每列都是独立的工作,听起来每列启动一个工作项会更简单,并让它为该列执行每一行。如下所示:

kernel void foo(...)
{
  int column = get_global_id(0);
  for (int row = 0; row < 512; row++)
  {
    // Do processing for (column,row), based on (column,row-1),
    // which was also processed by this work-item
  }
}

这将作为一维内核启动,全局大小等于列数。