访问_local内存会产生CL_INVALID_PROGRAM_EXECUTABLE

时间:2017-10-29 20:40:02

标签: opencl gpgpu

我需要计算一对工作项变量的总和。对于我的用例,组大小为{8},我需要计算工作项对[0,1],[2,3],[4,5],[6,7]的总和。我在本地函数中执行此求和,由内核函数调用。

部分代码:

__local float localSum[8];
int lid = get_local_id(0);
localSum[lid] = var;
barrier(CLK_LOCAL_MEM_FENCE);
if (lid % 2 == 0) {
   localSum[lid] += localSum[lid+1];
   // localSum[lid] = 0.f; //Incorrect implementation but works
}

在排队内核后使用上面的代码,它给出了CL_INVALID_PROGRAM_EXECUTABLE。我尝试使用clGetProgramBuildInfo进行调试,以确保内核编译正常。并且,我没有看到任何错误消息,只有几个关于未使用变量的警告。

如果我评论对和线和下面的取消注释行(这不是我想要的功能),它不会给出任何错误。

这段代码有什么问题吗?我唯一的猜测是我不应该在本地功能中这样做。对本地函数与内核代码无法做什么有任何限制?

1 个答案:

答案 0 :(得分:0)

在设备端, __ local 地址空间中的内存只能在内核函数中分配,而不能在此处调用的任何其他设备函数中分配。 OpenCL Reference的相关摘录:

  

允许指向__local地址空间的指针作为参数   函数(包括内核函数)。分配的变量   内核函数中的__local地址空间必须出现在内核函数范围内。

但是,您可以在内核函数中分配变量,然后传递指针。例如:

kernel void test() {
    __local float localSum[8];
    calculate(localSum);
}

void calculate(__local float *localSum) {
    size_t lid = get_local_id(0);
    localSum[lid] = 0;
    barrier(CLK_LOCAL_MEM_FENCE);
    if (lid % 2 == 0) {
       localSum[lid] += localSum[lid+1];
       localSum[lid] = 0.f; //Incorrect implementation but works
    }
}