CUDA中大小为4的非法写入

CUDA中大小为4的非法写入,cuda,Cuda,我编写了一个代码,当我使用cuda gdb为特定输入运行它时,由于设备地址非法,它面临内核启动失败。我使用cuda memcheck运行它,得到大小为4的无效写入错误。代码太大,因此我将在这里解释该场景 我有一个主内核,我将数组指针作为堆栈传递给它。 我有一个从主内核调用并使用堆栈的设备函数 __device__ void find(int v , int* p, int* pv,int n, int* d_stackContents) { int d_stackTop; d_

我编写了一个代码,当我使用cuda gdb为特定输入运行它时,由于设备地址非法,它面临内核启动失败。我使用cuda memcheck运行它,得到大小为4的无效写入错误。代码太大,因此我将在这里解释该场景

我有一个主内核,我将数组指针作为堆栈传递给它。 我有一个从主内核调用并使用堆栈的设备函数

__device__ void find(int v , int* p, int* pv,int n, int* d_stackContents)
{

    int d_stackTop;
    d_stackTop = -1;
    *pv = p[v];
    if(*pv == -1){
            *pv = v;

    }
    else{
    cuPrintf("Stack top is %d\n",d_stackTop);
    d_stackTop = d_stackTop + 1;
    d_stackContents[d_stackTop] = v;
    cuPrintf("Stack top is %d\n",d_stackTop);
    while(*pv != -1){
            d_stackTop = d_stackTop + 1;
            d_stackContents[d_stackTop] = *pv;
            cuPrintf("Stack top is %d\n",d_stackTop);
            *pv = p[*pv];
    }

}
错误发生在d_stackContents[d_stackTop]=*pv

我在主内核中调用设备函数,如下所示:

查找(v[idx],p和pv,n,d_)

其中idx=threadIdx.x+blockDim.x*blockIdx.x,我已将pv声明为int pv


此外,d_stackContents数组在main中使用cudamaloc分配,并作为参数传递给主内核

除非在单个块中使用单个线程调用内核,否则这将不起作用。否则,所有线程都会在彼此的堆栈上涂鸦。如果随后取消引用存储在损坏堆栈上的指针,它将立即解释代码试图访问非法地址的原因


您需要为每个线程使用单独的堆栈,或者在全局内存中使用一个堆栈指针,该堆栈指针只能通过原子操作进行操作。

除非在单个块中使用单个线程调用内核,否则这将不起作用。否则,所有线程都会在彼此的堆栈上涂鸦。如果随后取消引用存储在损坏堆栈上的指针,它将立即解释代码试图访问非法地址的原因

您需要为每个线程使用单独的堆栈,或者在全局内存中使用一个堆栈指针的单个堆栈,该堆栈指针只能通过原子操作进行操作