OpenCL搜索数组并设置一个标志

时间:2011-04-29 22:00:18

标签: opencl gpgpu gpu-programming

我是使用OpenCL的新手,这看起来应该很简单,所以请耐心等待。

我正在编写一个简单的内核来扫描数组并查找特定值。如果在数组中的任何位置找到该值,我想要设置一个标志。如果未找到该值,则该标志应保持为0;

目前我正在创建一个cl_mem对象来保存int

    cl_mem outputFlag = clCreateBuffer(mCLContext, CL_MEM_WRITE_ONLY, sizeof(cl_int), NULL, NULL);

将其设置为内核参数

    clSetKernelArg(mCLKernels[1],1, sizeof(cl_mem), &outputFlag);

并执行我的内核,如下所示:

__kernel void checkForHole(__global uchar *image , __global int found, uchar holeValue)
{
    int i = get_global_id(0);
    int j = get_global_id(1);

    uchar sample = image[i*j];

    if (sample == holeValue) {
        found = 1;
    }   
}

请注意,我的数组是2D,但它无关紧要。

当我在找到的条件中放入printf语句时,它会被调用(找到值)。但当我通过以下方式回读我的价值时:

 cl_int result;

errorCode = clEnqueueReadBuffer(mCLCommandQueue, outputFlag, CL_TRUE
                                , 0, sizeof(cl_int), &result, 0, NULL, NULL);

我得到0.有没有正确的方法在openCL中设置标志?如果有办法停止整个执行并且如果找到它就返回我的值也会很好。

我可以编写bool返回类型内核并返回true吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

在内核中,输出标志应该是指向int的指针。

将内核参数更改为__global int * found

我似乎总是通过在这里写下来解决我的问题......

如果有人知道停止执行的方法,或者甚至可能,我仍然会感兴趣:)