我一直在閱讀和閱讀這個矩陣乘法內核代碼,我只是不明白爲什麼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