不好意思,再次打扰了,如果使用makefile 编译的话我这样source=main.cu
RUN:=./sphgpu
CC=/data/apps/cuda/11.4/bin/nvcc
$(RUN):$(source) sph.o system.o SPHGPU.o ConfigDomain.o
$(CC) -lineinfo $(source) sph.o system.o SPHGPU.o ConfigDomain.o -o $(RUN)
sph.o:sph.cu
$(CC) -lineinfo --device-c sph.cu -o sph.o
system.o:system.cu
$(CC) -lineinfo --device-c system.cu -o system.o
SPHGPU.o:SPHGPU.cu
$(CC) -lineinfo --device-c SPHGPU.cu -o SPHGPU.o
ConfigDomain.o:ConfigDomain.cu
$(CC) -lineinfo --device-c ConfigDomain.cu -o ConfigDomain.o
.PHONY:clean
clean:
-rm -rf $(RUN)
-rm -rf *.o
或者将 -lineinfo改成 -G之后使用cuda-memcheck还是没有出现错误的行号,麻烦您指正一下错误,我尝试在网上搜相关资料没有搜到,麻烦您了
可以考虑用cuda-gdb来确定行号,有两种方案(精确和非精确的):
(1)直接用cuda-gdb --args 你的原本程序的命令行的方式,来运行你的程序。
然后在cuda-gdb的提示符下,输入:
set cuda memcheck on
然后输入r回车继续运行你的程序。
这种情况下,运行速度会变得较慢(有的时候会非常慢),但如果有kernel访存错误,会自动停留在这一行,并显示这一行的源代码(需要-g -G)。
(2)如果方法(1)慢到了无法忍受(例如经过了很久都没有停住),可以先全速运行,然后等待kernel出错的时候,暂停住进程(而不是返回出错代码或者挂掉):
export CUDA_DEVICE_WAITS_ON_EXCEPTION=1
你原本的程序命令行 回车
(耐心等待程序挂掉)
然后当屏幕上出现类似你的kernel访存错误,请使用调试器来调试进程XXXX(一个进程编号)的时候,继续输入:
sudo cuda-gdb --pid=XXXX
然后回车几次后,会停留在出错的源代码行附近(注意不是精确的)。
如果你看到的不是源代码,而是某处含有intrinsic字样的汇编代码之类的,继续输入bt回溯,一般再上一个就是出错的你的代码的位置(的附近)。
注意第二种方法不是精确的(因为流水线之类的原因),实际位置往往会偏后一点点。不过这种方法几乎万能,稍微往上看看就能找到。