2011-11-20 111 views
0

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

+0

沒關係,我修好了。我的localWorkSize參數是0 ...很多愚蠢的錯誤。 :( – Tudor

+1

local_work_size可以是一個NULL值,在這種情況下,OpenCL實現將決定如何將全局工作項分解到適當的工作組實例中,所以傳遞0應該不會導致崩潰 – vocaro

+0

@vocaro你是對的。在代碼上做了更多的工作,實際的問題是globalWorkSize不是localWorkSize的倍數。 – Tudor

回答

2

這是我得到的錯誤:

error: kernel pointer arguments must point to addrSpace global, local, or constant

float* C參數也許應該是__global。所有內核指針參數都需要一個地址空間限定符。

+0

D'oh我是怎麼想到的?謝謝。 – Tudor