【问题标题】:OpenCL to search array and set a flagOpenCL 搜索数组并设置标志
【发布时间】:2011-08-15 19:43:07
【问题描述】:

我是使用 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 吗?

谢谢!

【问题讨论】:

    标签: opencl gpgpu gpu


    【解决方案1】:

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

    将内核参数改为__global int *found

    我似乎总是在这里写下我的问题....

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

    【讨论】:

    • 如果每个线程只搜索数组的一个元素,发送到GPU后就无法停止执行。
    • @Klee1 为什么?如果可以停止执行更复杂的内核,为什么无法停止执行简单的内核?
    猜你喜欢
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多