OpenCL для поиска в массиве и установки флага - PullRequest
1 голос
/ 30 апреля 2011

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

2 голосов
/ 30 апреля 2011

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

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

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

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

...