我正在尝试将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
}
答案 0 :(得分:4)
在函数体中定义时,作为局部变量:
int main(void)
{
const int VOL_SIZE = 8650752;
float hVOL[VOL_SIZE];
编译器将在堆栈中分配对象hVol
。但是此对象不适合最大堆栈大小,因此您会收到此错误。对于这样的大对象,您需要动态分配内存:
float *hVOL = malloc(sizeof(float) * VOL_SIZE);