C++ CUDA全局函数中的局部指针数组

C++ CUDA全局函数中的局部指针数组,c++,cuda,C++,Cuda,我是CUDA的新手。有人能解释一下为什么这个代码无效吗?我试图在GT240显卡上运行它,内存检查器在buf[0][0]行上显示访问冲突错误 代码如下: __global__ void addKernel(char *c) { int i = threadIdx.x; if(i < 1) { char* buf[2]; char some[3] = "ab"; char another[3] = "cd";

我是CUDA的新手。有人能解释一下为什么这个代码无效吗?我试图在GT240显卡上运行它,内存检查器在buf[0][0]行上显示访问冲突错误

代码如下:

__global__ void addKernel(char *c)
{
    int i = threadIdx.x;

    if(i < 1) {
        char* buf[2];
        char some[3] = "ab";
        char another[3] = "cd";

        buf[0] = some;
        buf[1] = another;

        c[i] = buf[0][0];
    }
}
\uuuuu全局\uuuuu无效添加内核(char*c)
{
int i=threadIdx.x;
if(i<1){
char*buf[2];
char some[3]=“ab”;
另一个字符[3]=“cd”;
buf[0]=一些;
buf[1]=另一个;
c[i]=buf[0][0];
}
}
谢谢

更新: 在一个函数中计算某些内容并将结果传递给另一个函数的可能解决方案是将数据存储在全局内存中(1.x计算),如下所示:

__device__ char* buf[2];
__device__ char some[3];
__device__ char another[3];

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;

    if(i < 1) {
        some[0] = 'a';
        some[1] = 'b';

        another[0] = 'c';
        another[1] = 'd';

        buf[0] = some;
        buf[1] = another;

        buf[0][0] = 'b';
        c[i] = 1;
        }
}
\uuuu设备\uuuuu字符*buf[2];
__设备字符部分[3];
__设备_uu_uu字符另一个[3];
__全局无效addKernel(int*c,const int*a,const int*b)
{
int i=threadIdx.x;
if(i<1){
一些[0]=“a”;
一些[1]=“b”;
另一个[0]=“c”;
另一个[1]=“d”;
buf[0]=一些;
buf[1]=另一个;
buf[0][0]=“b”;
c[i]=1;
}
}

在我看来是正常的,当我在Linux桌面上的调试器中运行它时,它可以正常工作

建议如下:

  • char*c指向无效地址,或
  • 您正在使用的编译器中存在一些奇怪的编译器错误,无法初始化
    char some[3]
    ——请尝试用更简单的赋值语句将其分解,或者
  • threadIdx.x
    为负值的可能性?i、 e.如果threadIdx.x为-1,则c[i]为c[-1],这可能无效
  • 这是一个典型的问题,在GT240上,
    buff
    将存储在寄存器或本地内存中,
    c
    存储在全局内存中,这一事实使问题更加严重。指针在compute 1.x设备中不可移植


    您尝试的操作在您拥有的编程模型/硬件中至少有两种不同的方式是非法的,并且永远无法使其正常工作。

    您没有在GPU上运行此操作,是吗?好的,这是有意义的。但是buf[0][0]=“b”有什么问题;line?With
    buf[0][0]='b'
    编译器优化将去除内核的完整内容(因为没有任何内容会导致全局内存写入)。所以我不会说这个案例“工作正常”,只是你不能让这个案例因为编译器的行为而导致问题。