我有一个长度为22500的数组,其中填充了1和0: {0,0,0,1,1,0,1,0,0,0,1,0} 为了执行我的后续迭代,我需要知道该数组中有多少1(非常简单的2步减少),更重要的是它们在什么位置。考虑到上面的示例数组,位置应采用{3,4,6,10}格式。有没有聪明的方法在opencl中做到这一点?将阵列复制到我的主机程序并在CPU上运行它将花费太长时间。排队单个内核也需要很长时间。
我基本上希望能够运行256个工作程序(一个工作组),每当工作人员遇到'1'时,它会将索引添加到索引数组中。
以下是我想要使用的内核草稿:
__kernel void findIndexesOfRowsToCecalc(__global int * rowsToRecalc, __global int * lengthOfArray,__global int * indexes,__global int * sum){
int lid = get_local_id(0);
__local int ctr = 0;
__local int sums[256];
int mysum = 0;
for (int i = lid; i < *lengthOfArray; i += get_local_size(0)){
barrier(CLK_LOCAL_MEM_FENCE);
if (*(rowsToRecalc + i) == 1){
*(indexes + ctr) = i;
ctr = ctr + 1;
mysum = mysum + 1;
}
}
sums[lid] = mysum;
barrier(CLK_LOCAL_MEM_FENCE);
int pmax = get_local_size(0)>>1;
while (pmax>0){
if (lid < pmax){
sums[lid] = sums[lid] + sums[lid + pmax];
}
pmax = pmax >> 1;
}
barrier(CLK_LOCAL_MEM_FENCE);
if (lid == 0){
*sum = sums[0];
}
}
我担心的是,如果两个工人同时遇到'1',他们是否会尝试将其写入索引数组中的相同位置,或者本地ctr变量会在发生之前递增?还有另一种解决方法吗?
非常感谢你!