Cuda 尝试分配外部“共享”内存指针会导致;表达式必须是可修改的左值;错误

Cuda 尝试分配外部“共享”内存指针会导致;表达式必须是可修改的左值;错误,cuda,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

我有如下代码:

__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);
}
\uuuuu设备\uuuuu无符号字符*设备功能(无符号字符*变量,无符号字符参数){
if(var_sh[0]==param)
返回变量sh+param;
否则返回0;
}
__全局函数无效全局函数(uchar参数){
外部共享无符号字符变量sh[];
//只需将内容从全局复制到共享内存:
对于(int i=blockIndex;iinitial[i];
}
var_sh=设备功能(var_sh,参数);
}
此全局函数的调用方式如下:

global_func<<< blocks,threads,shared_size >>>(parameters);
全局函数>(参数);
但是当我尝试编译时,编译器在“var_sh=device_func(var_sh,parameters);”行返回以下错误:

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


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

这个错误意味着“=”左边的表达式不能修改。在本例中,已经定义了var_sh,它是一个无符号字符数组,但在代码中,您为var_sh分配了另一个指针:“var_sh=device_func(var_sh,parameters)”,它可能指向另一个地址,但不指向共享内存。

当我们将
\u shared_
内存声明为
extern
时,在使用该变量之前,我们需要将其分配给指针。在我的问题中,我使用了
var\u sh
并试图修改它,但首先我需要将它分配给一个指针,然后根据需要使用它

我已通过以下操作解决了问题:

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

这样,
var\u sh
是一个
可修改的左值
,我可以使用和修改它

但我要返回一个共享内存地址。它是原始地址+一些东西。我已经分配了所需的内存。另外,你能告诉我如何修复它吗?我需要将数据放在共享内存中,因为它速度更快,并且对该数据的访问不遵循任何模式。您的设备\u func可能返回0,这是一个整数,但var\u sh是指向共享内存的指针,因此可能会发生此错误。只需按照中给出的示例,基于
extern
共享内存分配创建任意指针即可。不要试图重新分配
var\u sh
,创建一个新指针并将其设置为您想要的任何值。@RobertCrovella,我照您说的做了。问题在于var_sh,我使用它的方式与外部调用的方式相同。我已经修复了这样做:
extern\uuuuuuuuuuuuuuu共享\uuuuuuuchar数组[]
uchar*aut_sh=(uchar*)数组。这个答案很有用,但对我没有帮助。那么,你能正确地回答吗?这样我就可以按照回答进行检查了?谢谢