使用OpenCL在许多GPU线程上运行相同的for循环

时间:2015-10-28 21:20:34

标签: opencl gpu pyopencl

我需要从许多其他不同的2D数组中减去2D数组D。我已经线性化(扁平化)所有数组:D是一个25个元素的数组,而imges是一个1D数组,4个25个元素的数组已连接在一起。含义:如果我想从4个5x5数组中减去D,我只是将这些5x5数组中的每一个转换为一个25个元素的数组,然后附加4个数组。那就是imgs,在这个例子中它将是一个100元素的数组。我相信我在内核中正确地捕获了这个,索引方式。

进行减法的唯一方法是运行for循环,以便从相应线程中的数组中减去D中的每个元素。我的想法是,这将如下工作:

  1. 每个线程都会收到要删除的D数组,以及必须从中减去D的其中一个数组(在我的例子中,{{1}的1/4 }})

  2. 我会用for循环遍历两个数组的元素,按元素执行减法元素

  3. 然而,它没有按预期工作:似乎只选择imges的最后一个或第一个值,然后从其他数组的所有元素中减去。

    我认为我对GPU上的索引和线程工作方式有所了解,但现在我不太确定,因为这一直困扰着我。内核如下。

    除了使用for循环之外,还有更好的方法吗?非常感谢。

    D

    编辑:我不希望并行化__kernel void reduce(__global float* D, __global float* imges, __global float* res) { const int x = (int)get_global_id(0); const int y = (int)get_global_id(1); const int z = (int)get_global_id(2); int im_i = imges[x+25]; //Images are 5x5 meaning a 25-size array for(int j = 0; j < 25; j++){ res[x+25] = im_i - D[j]; } } 循环本身,因为数组可能会变大,我不想遇到开销问题。

1 个答案:

答案 0 :(得分:1)

如果我理解你要做的正确,你的内核看起来应该更像这样:

__kernel void reduce(__global float* D, __global float* imges, __global float* res)
{
  const int x = (int)get_global_id(0);

  for(int j = 0; j < 25; j++){
    res[x*25 + j] = imges[x*25 + j] - D[j];
  }
}

此内核将从j中每个工作项的25个元素数组的D元素中减去jimges元素。