本文方法限以下条件使用
- 运行环境没有改变
- 之前代码可以正常运行
- 代码修改后再同样的环境下出现了这个问题
如果满足以上三个条件,则一般不是CUDA出现了问题,则可以尝试用以下方法:
将代码在cpu上运行,不用GPU,这时候再报错就会给出具体出现问题的代码位置,有针对性的进行修改就好了
20220315更新
又发现一个另外一种方法:
做过并行计算或者操作系统的同学可能知道,GPU的计算方式一般是异步的。异步运算不像同步运算那样是按照顺序一步一步来,异步是同时进行的,异步计算中,两种不一样的操作可能会发生同时触发的情况,这是处理两者间的前后关系、依赖关系或者冲突关系就比较重要了。
有一个众所周知的小技巧,在执行训练程序的时候将环境变量CUDA_LAUNCH_BLOCKING=1
设为1(强制同步)可以准确定位观察到我们显存操作的错误代码行数。