OpenCL для поиска массива и установки флага

Я новичок в использовании 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;
    }   
}

Обратите внимание, что мой массив двумерный, хотя это не имеет значения.

Когда я помещаю оператор printf в найденное условие, он вызывается (значение найдено). Но когда я прочитал свое значение через:

 cl_int result;

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

Я получаю 0. Есть ли правильный способ установить флаг в openCL? также было бы неплохо, если бы был способ остановить все выполнение и просто вернуть мое значение, если оно найдено.

Могу ли я написать ядро ​​с типом возврата bool и просто вернуть true?

Спасибо!


person wallacer    schedule 29.04.2011    source источник


Ответы (1)


В ядре выходной флаг должен быть указателем на целое число.

Измените параметр ядра на __global int *found

Я всегда, кажется, выясняю свои проблемы, просто пишу их здесь....

Если кто-нибудь знает способ остановить выполнение, или если это вообще возможно, мне все равно будет интересно :)

person wallacer    schedule 29.04.2011
comment
Если каждый поток ищет только один элемент массива, будет невозможно остановить выполнение после того, как вы отправите их в GPU. - person KLee1; 27.05.2011
comment
@KLee1 Почему? если можно остановить выполнение более сложного ядра, то почему нельзя остановить выполнение простого ядра? - person Emanuel Ey; 12.12.2011