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

CUDA Stack size when using CUDA Debugging

本文关键字:CUDA 堆栈 调试 使用      更新时间:2023-10-16

我正在使用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 %dn",(int)size_heap,(int)size_stack);

默认堆栈大小为 6464,所以我想将其加倍以查看是否有任何改进。当我使用标准 Windows 调试器启动程序时,cudaDeviceGetLimit(&size_stack, cudaLimitStackSize)返回的堆栈大小按预期为 12928。

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

似乎这只是一个错误,我更新了 CUDA 7.0 候选版本,堆栈分配现在运行良好。

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