Ядро OpenCL не может скомпилировать - PullRequest
0 голосов
/ 21 ноября 2011

Я продолжаю читать и читать этот код ядра матричного умножения, и я просто не понимаю, почему вызов clBuildProgram возвращает CL_BUILD_PROGRAM_FAILURE.Вот мой код ядра:

__kernel void MatMulKernel(__global const float* A, 
                           __global const float* B, 
                                          float* C, 
                                    const int size1, 
                                    const int size2, 
                                    const int size3) 
{   
    int k = get_global_id(0);
    int i;

    int line = k / size3;
    int column = k % size3;

    float partial = 0;

    for(i = 0; i < size2; i++)
    {
        partial += A[line * size2 + i] * B[i * size3 + column];
    }

    C[k] = partial; 
}

Может кто-нибудь определить проблему?Спасибо.

Примечание. Код, выполняющий инициализацию, корректен, поскольку я протестировал другие ядра и они правильно скомпилированы.

Редактировать : Хорошо, ответ prunge сделалхитрость, но теперь я сталкиваюсь с другой проблемой.Выполнение ядра на самом деле вызывает сбой.Вот код:

err = clSetKernelArg(hKernel, 0, sizeof(cl_mem), (void *)&hDeviceMemA);
err = clSetKernelArg(hKernel, 1, sizeof(cl_mem), (void *)&hDeviceMemB);
err = clSetKernelArg(hKernel, 2, sizeof(cl_mem), (void *)&hDeviceMemC);
err = clSetKernelArg(hKernel, 3, sizeof(cl_int), (void *)&s1);
err = clSetKernelArg(hKernel, 4, sizeof(cl_int), (void *)&s2);      
err = clSetKernelArg(hKernel, 5, sizeof(cl_int), (void *)&s3);  

cl_event events[1];
// execute kernel
start = clock();
err = clEnqueueNDRangeKernel(hCmdQueue, hKernel, 1, 0, (const size_t *)BENCH_SIZE_COMP, 0, 0, 0, &events[0]);       
clWaitForEvents(1, events);

Все значения ошибок для вызовов на clSetKernelArg равны CL_SUCCESS.Когда программа достигает clEnqueueNDRangeKernel, происходит сбой.

1 Ответ

2 голосов
/ 21 ноября 2011

Это ошибка, которую я получил:

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

Параметр float* C, вероятно, должен быть __global. Для всех аргументов указателя ядра требуется спецификатор адресного пространства.

...