cudaErrorIllegalAddress 的文档说:
设备在无效的内存地址上遇到加载或存储指令。这使进程处于不一致状态,任何进一步的 CUDA 工作都将返回相同的错误。要继续使用 CUDA,必须终止并重新启动该过程。
在我的C++代码中,我调用了:
cudaMemcpy( dst, src, size, kind );
如何确定是无效内存是dst
还是src
?
运行cuda-memcheck
未报告任何错误,valgrind
报告任何错误。 鉴于此崩溃仅在使用 -g -G
构建时发生,我可以采取哪些步骤来进一步调试? 有没有办法在设备代码中检查是否发生了 cudaErrorIllegalAddress,以便我可以划分和征服设备代码中失败的位置?
答案是两者都不是。根据文档,cudaMemcpy
本身只会返回三个状态代码之一:
cudaSuccess, cudaErrorInvalidValue, cudaErrorInvalidMemcpyDirection
但是,该文档还注意到以下内容:
请注意,此函数还可能从以前的异步启动返回错误代码。
这就是错误的可能来源,即先前的内核正在产生运行时错误,然后由阻塞 API 调用报告。