我有类似下面的代码:
__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);”行上返回以下错误:“
“错误:表达式必须是可修改的左值”
我不知道为什么,有人可以解释一下吗?
答案 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_sh
是modifiable lvalue
,我可以使用和修改它。