使用 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 %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 注册开发人员,您需要在他们的网站上注册。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- 在cuda线程之间共享大量常量数据
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- CUDA内核和数学函数的显式命名空间
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- CUDA:统一内存和指针地址的更改
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 调试 CUDA MMU 故障
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- OpenCV3.3 CUDA 堆栈粉碎
- CUDA 编程未处理的异常和堆栈溢出
- 使用 CUDA 调试时的 CUDA 堆栈大小