尝试分配extern __shared__内存指针会导致“表达式必须是可修改的左值”错误

时间:2013-09-09 21:53:15

标签: cuda

我有类似下面的代码:

__device__ unsigned char* device_func(unsigned char* var_sh, unsigned char param){
    if (var_sh[0] == param)
        return var_sh + param;
    else return 0;
}

__global__ void global_func(uchar parameters){
    extern __shared__ unsigned char var_sh[];
    //just copying things from global to shared memory:
    for(int i = blockIndex; i < size; i += blockDim.x * gridDim.x){
        var_sh[i] = rla->initial[i]; 
    }
    var_sh = device_func(var_sh, parameters);
}

以这种方式调用此全局函数:

global_func<<< blocks,threads,shared_size >>>(parameters);

但是当我尝试编译时,编译器在“var_sh = device_func(var_sh,parameters);”行上返回以下错误:“

“错误:表达式必须是可修改的左值”

我不知道为什么,有人可以解释一下吗?

2 个答案:

答案 0 :(得分:2)

此错误表示无法修改“=”左侧的表达式。在这种情况下,var_sh已经定义,它是一个unsigned char数组,但在你的代码中,你指定另一个指向var_sh的指针:'var_sh = device_func(var_sh,parameters)',它可能指向另一个地址,但不是共享存储器中。

答案 1 :(得分:0)

当我们将__shared__内存声明为extern时,我们需要在使用它之前将此变量赋值给指针。在我的问题中我使用var_sh并试图修改它,但首先我需要将它分配给指针然后像我想要的那样使用它。

我已经解决了我的问题:

extern __shared__ uchar array[];
uchar* var_sh = (uchar*) array;

这种方式var_shmodifiable lvalue,我可以使用和修改它。