【问题标题】:How to determine whether cudaErrorIllegalAddress is due to the destination or source address?如何确定 cudaErrorIllegalAddress 是由于目标地址还是源地址?
【发布时间】:2019-08-19 16:05:29
【问题描述】:

documentation for cudaErrorIllegalAddress 说:

设备在无效内存地址上遇到加载或存储指令。这会使进程处于不一致的状态,任何进一步的 CUDA 工作都将返回相同的错误。要继续使用 CUDA,必须终止并重新启动该进程。

在我的 C++ 代码中,我调用了:

cudaMemcpy( dst, src, size, kind );

如何判断是dst还是src是无效内存?


运行cuda-memcheck 未报告错误,valgrind 未报告错误。鉴于此崩溃仅在使用 -g -G 构建时发生,我可以采取哪些步骤来进一步调试?设备代码中有没有办法检查是否发生了 cudaErrorIllegalAddress,以便我可以分而治之,在设备代码中失败的地方?

【问题讨论】:

  • 此错误与您摘录的代码行没有任何关系,除了在那里报告。设备活动的 CUDA 错误报告是异步的。使用cuda-memcheck 运行您的代码,您应该会更清楚,请参阅here。仔细阅读您从文档中摘录的第一行内容。它指的是设备代码的执行。 cudaMemcpy 是主机库调用,与设备代码执行无关。
  • @RobertCrovella 只有在构建-g -G 时才会发生这种情况,这对您有什么有用的建议吗? (我现在正在运行 cuda-memcheck。)
  • 由于-G 会影响设备代码的生成,因此无论使用或不使用它编译的设备代码的行为都可能完全不同。编译器会在没有-G 的情况下进行更积极的死代码删除(对全局或可观察状态没有影响的代码),因此如果某些“死代码”进行越界访问,那可能对这一观察的解释。但据我所知,它没有任何“有用”的调试目的。例如,当您在cuda-memcheck 下运行时,您可能会发现即使您的非-G 代码也在进行非法访问,或者没有
  • @RobertCrovella 不幸的是,cuda-memcheck 没有报告错误,请查看更新后的问题。
  • 你在用-G编译的代码上运行了cuda-memcheck,自己运行时报错?

标签: c++ error-handling cuda memory-corruption


【解决方案1】:

答案都不是。根据documentationcudaMemcpy 本身只会返回三个状态码之一:

cudaSuccess, cudaErrorInvalidValue, cudaErrorInvalidMemcpyDirection

但是,文档还指出以下内容:

请注意,此函数还可能返回之前异步启动的错误代码。

这可能是错误的来源,即先前的内核正在产生运行时错误,然后阻塞 API 调用会报告该错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多