Я новичок в использовании 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?
Спасибо!