查找数组中特定值的索引(openCL)

时间:2014-06-20 13:46:13

标签: c++ arrays opencl

我有一个长度为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变量会在发生之前递增?还有另一种解决方法吗?

非常感谢你!

0 个答案:

没有答案