我一直在阅读和阅读这个矩阵乘法内核代码,我只是不明白为什么clBuildProgram
的调用返回CL_BUILD_PROGRAM_FAILURE
。这里是我的内核代码:OpenCL内核无法编译
__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
它崩溃。
没关系,我修好了。我的localWorkSize参数是0 ...很多愚蠢的错误。 :( – Tudor
local_work_size可以是一个NULL值,在这种情况下,OpenCL实现将决定如何将全局工作项分解到适当的工作组实例中,所以传递0应该不会导致崩溃 – vocaro
@vocaro你是对的。在代码上做了更多的工作,实际的问题是globalWorkSize不是localWorkSize的倍数。 – Tudor