OpenCL内核无法编译

时间:2011-11-20 21:41:28

标签: c multithreading opencl parallel-processing gpu

我一直在阅读和阅读这个矩阵乘法内核代码,我只是不明白为什么调用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; 
}

有人能发现问题吗?谢谢。

注意:执行初始化的代码是正确的,因为我已经使用其他内核进行了测试并且编译正确。

编辑:Ok 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时,它会崩溃。

1 个答案:

答案 0 :(得分:2)

这是我得到的错误:

  

错误:内核指针参数必须             指向addrSpace全局,本地或常量

float* C参数可能应为__global。所有内核指针参数都需要一个地址空间限定符。