使用 CUDA 调试时的 CUDA 堆栈大小

CUDA Stack size when using CUDA Debugging

我正在使用 Visual Studio 2012 并得到了一些在使用 CUDA 调试执行代码时崩溃的内核。其他一些内核运行相同的代码没有任何问题(在不同的生成数字/数据上)。我不知道在没有 CUDA 调试的情况下运行程序时内核是否崩溃,因为我没有收到任何错误。

错误是:

CUDA Debugger detected data stack overflow on 120 threads.  
First thread:  
blockIdx = {2,0,0}  
threadIdx = {1,0,0}  
StackPointer = 0x00ffe9d0  
StackLimit = 0x00ffea40   

通过查看文档,我找到了增加堆栈大小的方法(我还需要增加堆大小):

//Increase memory limits
size_t size_heap, size_stack;
cudaDeviceSetLimit(cudaLimitMallocHeapSize,20000000*sizeof(double));
cudaDeviceSetLimit(cudaLimitStackSize,12928);
cudaDeviceGetLimit(&size_heap, cudaLimitMallocHeapSize);
cudaDeviceGetLimit(&size_stack, cudaLimitStackSize);
printf("Heap size found to be %d; Stack size found to be %d\n",(int)size_heap,(int)size_stack);

默认堆栈大小是6464,所以我想把它加倍,看看有没有改进。当我使用标准 windows 调试器启动程序时,cudaDeviceGetLimit(&size_stack, cudaLimitStackSize) 返回的堆栈大小如预期的那样为 12928。

但是,当我使用 CUDA 调试器启动程序时,它报告堆栈大小为 1024,而不是 12928。这是为什么?

看来这只是一个错误, 我更新到 CUDA 7.0 Release Candidate,堆栈分配现在运行良好。

如果您遇到同样的问题,请更新到最新的驱动程序/工具包。 CUDA 7.0 RC 仅供 CUDA 注册开发者使用,您需要在他们的网站上注册。