2011-05-15 25 views
1

我怀疑我在运行的大型CUDA内核中有细粒度的内存错误。设备端printf在应该是确定性的变量上显示一些不同的值。我正在使用已删除的设备仿真模式的CUDA开发工具的“稳定”版本,其版本的cuda-gdb不适用于模板化函数。 Cuda-memcheck运行,但没有捕获任何东西。CUDA的细粒度内存检查器?

在CPU上,我会使用valgrind或电篱笆来捕捉像这样的内存错误。如果所有可用的都是printf,那么调试内存错误时有什么巧妙的技巧?

例如,有没有办法用nans洪泛整个内存空间,并使用printfs找到它们在我的计算中首次弹出的位置?

回答

1

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

+0

如果你在分配之间留有一些空白,这基本上是自己实施电子围栏库。一个缺点是,如果你真的分配了整个可用内存空间,那么你将自己限制为每个GPU一个cuda应用程序。 – 2011-05-17 13:33:44

+0

现在我想到了,假设你正在做主机上的所有分配,几乎可以实现自由度;你只需要使用LD_PRELOAD攻击来捕获cudaMalloc和cudaFree。唯一缺少的是将填充区域标记为不可读/不可写的功能,以便在出现界限时自动对段进行分段。 – 2011-05-17 13:38:10

+0

@Drew Wagner:如果你愿意的话,你可以少分配整个gou的内存。 CUDA-memcheck或运行时可以捕捉可能会压缩VRAM或其他应用程序空间的事物。我只是把它全部分配,因为我倾向于处理需要每个字节的大线性代数问题。 – talonmies 2011-05-17 13:46:45