我怀疑我正在运行的大型CUDA内核中存在细粒度内存错误。设备端printf显示应该是确定性的变量的一些变化值。 CUDA开发工具的“稳定”版本我正在使用移除设备仿真模式,其版本的cuda-gdb不适用于模板化功能。 Cuda-memcheck运行,但没有抓到任何东西。
在cpu上,我会使用valgrind或电栅栏来捕捉这样的内存错误。如果所有可用的都是printf,那么调试内存错误有哪些巧妙的技巧?
例如,有没有办法用nans填充整个内存空间并使用printfs查找它们在我的计算中首次弹出的位置?
答案 0 :(得分:1)
对于这种事情,我喜欢分配整个可用的全局内存空间,然后自己管理内存。使用自定义memset函数将整个分配设置为可识别的字大小的位模式,然后在分配中初始化块以供内核使用。如果你实现一个简单的设备端断言来捕获该位模式并报告它出现的线程,块,行,你应该能够隔离cuda-memcheck没有捕获的超出范围的全局内存读取。