我需要从许多其他不同的2D数组中减去2D数组D
。我已经线性化(扁平化)所有数组:D
是一个25个元素的数组,而imges
是一个1D数组,4个25个元素的数组已连接在一起。含义:如果我想从4个5x5数组中减去D
,我只是将这些5x5数组中的每一个转换为一个25个元素的数组,然后附加4个数组。那就是imgs
,在这个例子中它将是一个100元素的数组。我相信我在内核中正确地捕获了这个,索引方式。
进行减法的唯一方法是运行for
循环,以便从相应线程中的数组中减去D
中的每个元素。我的想法是,这将如下工作:
每个线程都会收到要删除的D
数组,以及必须从中减去D
的其中一个数组(在我的例子中,{{1}的1/4 }})
我会用for循环遍历两个数组的元素,按元素执行减法元素
然而,它没有按预期工作:似乎只选择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];
}
}
循环本身,因为数组可能会变大,我不想遇到开销问题。
答案 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
元素中减去j
个imges
元素。