OpenCL搜索数组并设置标志

OpenCL搜索数组并设置标志,opencl,gpgpu,gpu,Opencl,Gpgpu,Gpu,我是使用OpenCL的新手,这看起来应该很简单,所以请耐心听我说 我正在编写一个简单的内核来扫描数组并查找特定的值。如果在数组中的任何位置找到该值,我希望设置一个标志。如果未找到该值,则标志应保持为0 目前我正在创建一个cl_mem对象来保存int cl_mem outputFlag = clCreateBuffer(mCLContext, CL_MEM_WRITE_ONLY, sizeof(cl_int), NULL, NULL); 将其设置为内核参数 clSetKernel

我是使用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语句放入我的find条件中时,它确实会被调用(找到值)。但当我通过以下方式读回我的价值时:

 cl_int result;

errorCode = clEnqueueReadBuffer(mCLCommandQueue, outputFlag, CL_TRUE
                                , 0, sizeof(cl_int), &result, 0, NULL, NULL);
我得到0。有没有合适的方法在openCL中设置标志?如果有一种方法可以停止整个执行并在找到值时返回我的值,那也会很好

我可以写一个bool返回类型的内核并只返回true吗


谢谢

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

将内核参数更改为uu global int*found

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


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

如果每个线程只搜索数组的一个元素,那么在将它们发送到GPU后就不可能停止执行。@KLee1为什么?如果可以停止更复杂内核的执行,为什么不可能停止简单内核的执行?