Debugging CUDA的细粒度内存检查器?

Debugging CUDA的细粒度内存检查器?,debugging,cuda,Debugging,Cuda,我怀疑我正在运行的一个大型CUDA内核中存在细粒度内存错误。设备端printf显示了一些变量的变化值,这些变量应该是确定性的。我使用的CUDA开发工具的“稳定”版本是删除的设备仿真模式,其版本的CUDA gdb不能使用模板化函数。Cuda memcheck跑了,但什么也抓不到 在cpu上,我会使用valgrind或electric fence来捕获这样的内存错误。如果您只有printf,那么调试内存错误有什么巧妙的技巧呢 例如,有没有一种方法可以让NAN充斥整个内存空间,并使用printfs找到

我怀疑我正在运行的一个大型CUDA内核中存在细粒度内存错误。设备端printf显示了一些变量的变化值,这些变量应该是确定性的。我使用的CUDA开发工具的“稳定”版本是删除的设备仿真模式,其版本的CUDA gdb不能使用模板化函数。Cuda memcheck跑了,但什么也抓不到

在cpu上,我会使用valgrind或electric fence来捕获这样的内存错误。如果您只有printf,那么调试内存错误有什么巧妙的技巧呢


例如,有没有一种方法可以让NAN充斥整个内存空间,并使用printfs找到它们在我的计算中第一次出现的位置?

对于这类事情,我喜欢分配整个可用的全局内存空间,然后自己管理内存。使用自定义memset函数将整个分配设置为可识别的字大小的位模式,然后初始化分配中的块以供内核使用。如果您实现一个简单的设备端断言来捕获该位模式,并报告它出现的线程、块、行,您应该能够隔离cuda memcheck无法捕获的越界全局内存读取。

对于这类事情,我喜欢分配整个可用的全局内存空间,然后自己管理内存。使用自定义memset函数将整个分配设置为可识别的字大小的位模式,然后初始化分配中的块以供内核使用。如果您实现一个简单的设备端断言来捕获该位模式,并报告它出现的线程、块、行,那么您应该能够隔离cuda memcheck无法捕获的越界全局内存读取。

如果您在分配之间留有一些间隙,这基本上是您自己实现electric fence库。一个缺点是,如果你真的分配了全部可用内存空间,你就把自己限制在每个gpu一个cuda应用程序上了。现在我想,假设你在主机上完成所有分配,几乎可以实现libefence;你只需要使用LD_预加载破解来捕获Cudamaloc和cudaFree。唯一缺少的是将填充区域标记为不可读/不可写的功能,以便在越界时自动进行分段。@Drew Wagner:如果需要,您可以分配少于整个gou内存的内存。CUDA memcheck或运行时可以捕获可能会阻塞VRAM或其他应用程序空间的东西。我之所以分配它,是因为我倾向于处理大型线性代数问题,这些问题需要它们能得到的每一个字节。如果在分配之间留有一些间隙,这基本上就是自己实现electric fence库。一个缺点是,如果你真的分配了全部可用内存空间,你就把自己限制在每个gpu一个cuda应用程序上了。现在我想,假设你在主机上完成所有分配,几乎可以实现libefence;你只需要使用LD_预加载破解来捕获Cudamaloc和cudaFree。唯一缺少的是将填充区域标记为不可读/不可写的功能,以便在越界时自动进行分段。@Drew Wagner:如果需要,您可以分配少于整个gou内存的内存。CUDA memcheck或运行时可以捕获可能会阻塞VRAM或其他应用程序空间的东西。我只是把它全部分配出去,因为我倾向于处理大型线性代数问题,这些问题需要他们能得到的每个字节。