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

时间:2015-01-02 23:36:05

标签: c++ cuda

我正在使用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.为什么会这样?

1 个答案:

答案 0 :(得分:2)

这似乎只是一个bug, 我更新了CUDA 7.0 Release Candidate,现在堆栈分配工作正常。

如果您遇到同样的问题,请更新到最新的驱动程序/工具包。 CUDA 7.0 RC仅适用于CUDA注册开发人员,您需要在其网站上注册。