【发布时间】: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