Я продолжаю читать и читать этот код ядра матричного умножения, и я просто не понимаю, почему вызов 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
, происходит сбой.