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