2011-11-20 112 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