我试图从一个设备复制到另一个主机大约8650752字节,但我得到堆栈溢出错误,令人惊讶的是,我可以从一个主机复制相同的数据到另一个设备,但在对其进行计算后,无法返回。代码很简单,所以不确定哪里出错了
代码:

__global__
void kernel(....)
{
    int x=threadIDX.x;

    for (int j=0; j<256; j++)
    {
        for (int i=0; i<256; i++)
        {
            int index = 256*256*x + 256*j + i;
            dVOL_in[(x*65536)+(256*j)+i]=index;
        }
    }

}

int main(void)
{
    const int VOL_SIZE = 8650752;
    const int VOL_BYTES = VOL_SIZE * sizeof(float);
    float hVOL[VOL_SIZE];
    float * dVOL_in;

    gpuErrchk(cudaMalloc((void**) &dVOL_in, VOL_BYTES));

    // volume data read from some file
    gpuErrchk(cudaMemset(dVOL_in,0,VOL_BYTES));
    gpuErrchk(cudaMemcpy(dVOL_in,Vol,VOL_BYTES, cudaMemcpyHostToDevice));  //works fine

    kernel<<<1,132>>>(....);
    cudaMemcpy(hVOL, dVOL_in, VOL_BYTES, cudaMemcpyDeviceToHost);  //stack overflow error
}

最佳答案

在函数体中定义为局部变量时:

int main(void)
{
   const int VOL_SIZE = 8650752;
   float hVOL[VOL_SIZE];

编译器将在堆栈中分配对象hVol。但是这个对象不适合最大的堆栈大小,所以你会得到这个错误。对于如此大的对象,需要动态分配内存:
   float *hVOL = malloc(sizeof(float) * VOL_SIZE);

关于c - 从设备复制数据到主机有什么限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16127514/

10-17 01:41