1

我有类似下面的代码:

__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);”行返回以下错误:

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

不知道为什么,谁能解释一下?

4

2 回答 2

2

这个错误意味着'='左边的表达式不能被修改。在这种情况下,var_sh 已被定义,它是一个无符号字符数组,但在您的代码中,您为 var_sh 分配了另一个指针:'var_sh = device_func(var_sh, parameters)',它可能指向另一个地址,但不是共享的记忆。

于 2013-09-10T01:27:39.333 回答
0

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

我已经解决了我的问题:

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

这种方式var_sh是一种modifiable lvalue,我可以使用和修改它。

于 2013-09-18T16:53:26.957 回答