之前记录的一些cuda的用法中也有关于cuda汇编的一些介绍。本文主要记录了带源代码行信息的cuda汇编文件的获取。主要内容参考CUDA Binary Utilities
程序编译时需要添加的参数
在makefile或者cmakelist文件中,添加如下内容到nvccflag或者手动添加到nvcc编译的参数中去。
-g -lineinfo
重新编译自己的程序。
获得cubins
以vectorAdd程序为例,使用cuobjdump获得在二进制文件中的所有cubins。
cuobjdump -xelf all ./vectorAdd
如果在makefile或者cmakelist中指定了生成多个架构的代码(sm_50, sm60, sm70 etc.),则执行完上述命令后,会生成多个cubins,比如vectorAdd.sm_75.cubin
等。
根据自己的目标架构选择将要解析的cubin。
反编译出sass
SASS是cuda的汇编格式,使用nvdisasm可以从cubin文件中获得。
nvdisasm -g ./vectorAdd.sm_75.cubin > vectorAdd.sm_75.sass
分析sass
Z9vectorAddPKfS0_Pfi:
.text._Z9vectorAddPKfS0_Pfi:
//## File "/home/findhao/NVIDIA_CUDA-11.2_Samples/0_Simple/vectorAdd/vectorAdd.cu", line 33
/*0000*/ MOV R1, c[0x0][0x28] ;
//## File "/home/findhao/NVIDIA_CUDA-11.2_Samples/0_Simple/vectorAdd/vectorAdd.cu", line 35
/*0010*/ S2R R6, SR_CTAID.X ;
/*0020*/ S2R R3, SR_TID.X ;
/*0030*/ IMAD R6, R6, c[0x0][0x0], R3 ;
//## File "/home/findhao/NVIDIA_CUDA-11.2_Samples/0_Simple/vectorAdd/vectorAdd.cu", line 37
/*0040*/ ISETP.GE.AND P0, PT, R6, c[0x0][0x178], PT ;
/*0050*/ @P0 EXIT ;
//## File "/home/findhao/NVIDIA_CUDA-11.2_Samples/0_Simple/vectorAdd/vectorAdd.cu", line 39
/*0060*/ MOV R7, 0x4 ;
/*0070*/ IMAD.WIDE R4, R6, R7, c[0x0][0x168] ;
/*0080*/ IMAD.WIDE R2, R6, R7, c[0x0][0x160] ;
/*0090*/ LDG.E.SYS R4, [R4] ;
/*00a0*/ LDG.E.SYS R3, [R2] ;
/*00b0*/ IMAD.WIDE R6, R6, R7, c[0x0][0x170] ;
/*00c0*/ FADD R9, R4, R3 ;
/*00d0*/ STG.E.SYS [R6], R9 ;
//## File "/home/findhao/NVIDIA_CUDA-11.2_Samples/0_Simple/vectorAdd/vectorAdd.cu", line 41
/*00e0*/ EXIT ;
.L_1:
/*00f0*/ BRA `(.L_1);
.L_26:
上述sass code中,//## File
行为源码行信息,该行之下的行为对应的sass code。
Comments