Проблемы OpenCL local_work_size - PullRequest
0 голосов
/ 26 июля 2011

У меня есть вектор размера n (неизвестный до запуска основной программы), и я хочу поэкспериментировать с размерами рабочей группы.Однако, если я не установлю для local_work_size число, которое точно делит n, я получу только 0 значений в fprop ниже.

Ядро:

__kernel void palt(__global double *fprop, __global const double *fcoll,
                   __global const int *nn, const uint max_size)
{
    size_t l = get_global_id(0);

    if( l > max_size ) return;

    fprop[l] = fcoll[nn[l]];

}

Код хоста:

int block_sz_p = 128;
const int max_size = ns*imax;

// set the parameters for the propagation operator
errNum = clSetKernelArg(propagation_kernel, 0, sizeof(cl_mem), &fpd);
errNum |= clSetKernelArg(propagation_kernel, 1, sizeof(cl_mem), &fcd);
errNum |= clSetKernelArg(propagation_kernel, 2, sizeof(cl_mem), &nnd);
errNum |= clSetKernelArg(propagation_kernel, 3, sizeof(int), (void *) &max_sz);
checkErr(errNum, "clSetKernelArg(propagation)");

// specify the work group size/dim
const size_t work_dim = 3;  
const size_t global_work_size_propagation[] = {imax*ns, 1, 1};
const size_t local_work_size_propagation[] = {block_sz_p, 1, 1};

// propagation
clEnqueueNDRangeKernel(queue, propagation_kernel, work_dim, NULL, 
                       global_work_size_propagation, local_work_size_propagation,
                       0, NULL, &event);

clWaitForEvents(1, &event); 
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, 
                        sizeof(cl_ulong), &start, NULL);
clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, 
                        sizeof(cl_ulong), &end, NULL);
tker2 = (end-start);

Что здесь происходит?

1 Ответ

1 голос
/ 26 июля 2011

Вы должны проверить ошибки CL, clEnqueueNDRangeKernel и другие вызовы возвращают код ошибки (другие возвращают код ошибки по ссылке).

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

CL_INVALID_WORK_GROUP_SIZE, если указано local_work_size, а количество рабочих элементов, указанное в global_work_size, не делится равномерно на размер рабочей группызадается local_work_size или не соответствует размеру рабочей группы, указанному для ядра с использованием спецификатора ((reqd_work_group_size (X, Y, Z))) в исходном коде программы.

Из clEnqueueNDRangeKernel Страница man .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...