【问题标题】:Fine Grained Memory Checker for CUDA?CUDA 的细粒度内存检查器?
【发布时间】:2023-04-06 14:54:01
【问题描述】:

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

在 cpu 上,我会使用 valgrind 或电栅栏来捕获这样的内存错误。如果你只有printf,那么调试内存错误有什么巧妙的技巧?

例如,有没有办法用 nans 填充整个内存空间并使用 printfs 来查找它们在我的计算中第一次弹出的位置?

【问题讨论】:

    标签: debugging cuda


    【解决方案1】:

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

    【讨论】:

    • 如果你在分配之间留下一些空白,这基本上是你自己实现的电子围栏库。一个缺点是,如果你真的分配了整个可用内存空间,你就会将自己限制为每个 gpu 一个 cuda 应用程序。
    • 现在我想了想,几乎可以实现 libefence,假设您在主机上进行所有分配;你只需要使用 LD_PRELOAD hack 来捕获 cudaMalloc 和 cudaFree。唯一缺少的是能够将填充区域标记为不可读/不可写,以便您在超出范围时自动进行段错误。
    • @Drew Wagner:如果你愿意,你可以分配更少的整个 gou 内存。 CUDA-memcheck 或运行时可以捕获会占用 VRAM 或其他应用程序空间的东西。我只是分配它,因为我倾向于处理需要他们可以获得的每个字节的大型线性代数问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多