如何让C代码与SASS和cuobjdump混合使用?
我不确定我在以错误的方式做什么,本质上我希望得到可读的汇编,混合C调用 下面是一些示例代码:如何让C代码与SASS和cuobjdump混合使用?,c,cuda,C,Cuda,我不确定我在以错误的方式做什么,本质上我希望得到可读的汇编,混合C调用 下面是一些示例代码: 示例.cu: 然后我跑: cuobjdump -sass --function _Z6kernelv example.cubin 输出包含汇编指令,但我看不到任何C代码: code for sm_30 Function : _Z6kernelv .headerflags @"EF_CUDA_SM30 EF_CUDA_PTX_SM(EF_CUDA_SM30)" /*0000*/
示例.cu
:
然后我跑:
cuobjdump -sass --function _Z6kernelv example.cubin
输出包含汇编指令,但我看不到任何C代码:
code for sm_30
Function : _Z6kernelv
.headerflags @"EF_CUDA_SM30 EF_CUDA_PTX_SM(EF_CUDA_SM30)"
/*0000*/ MOV R1, c[0x0][0x44]; /* 0x2800400110005de4 */
/*0008*/ ISUB R1, R1, 0x8; /* 0x4800c00020105d03 */
/*0010*/ S2R R0, SR_LMEMHIOFF; /* 0x2c000000dc001c04 */
/*0018*/ ISETP.GE.AND P0, PT, R1, R0, PT; /* 0x1b0e00000011dc23 */
/*0020*/ @P0 BRA 0x30; /* 0x40000000200001e7 */
/*0028*/ BPT.TRAP 0x1; /* 0xd00000000400c007 */
/*0030*/ IADD R0, R1, RZ; /* 0x48000000fc101c03 */
/*0038*/ MOV R2, R0; /* 0x2800000000009de4 */
/*0040*/ MOV R3, RZ; /* 0x28000000fc00dde4 */
/*0048*/ MOV R2, R2; /* 0x2800000008009de4 */
/*0050*/ MOV R3, R3; /* 0x280000000c00dde4 */
/*0058*/ MOV R4, c[0x0][0x24]; /* 0x2800400090011de4 */
/*0060*/ MOV R5, RZ; /* 0x28000000fc015de4 */
/*0068*/ IADD R2.CC, R2, R4; /* 0x4801000010209c03 */
/*0070*/ IADD.X R3, R3, R5; /* 0x480000001430dc43 */
/*0078*/ MOV32I R4, 0xff; /* 0x18000003fc011de2 */
/*0080*/ MOV R5, RZ; /* 0x28000000fc015de4 */
/*0088*/ MOV R4, R4; /* 0x2800000010011de4 */
我没有找到任何选项来明确说明example.cu
位于何处(尽管它位于同一目录中)。使用相同代码的OTOH Nsight Eclipse Edition显然能够使用C代码显示SASS(在Dissassembly窗口中的调试会话中):
目前不可能使用
cuobjdump
。引用的cuobjdump
文档/命令行帮助出错。因此它显然是一个bug。还有其他选择吗?可能是nvdism
?奇怪的是,nsight没有这样的限制。CUDA 6.5中的nvdisasm
也可以做到这一点(这是CUDA 6.5 AFAIK中的一项新功能)。您需要将代码编译成一个cubin,然后使用nvdism-g
转储cubin。它提供行引用,而不是源代码的实际行。我不确定它是否适用于每个nvcc
选项,我使用-g-g-lineinfo
编译到cubin,您可以尝试查看编译步骤中是否确实需要这些选项。nvdism
的-g
命令行选项记录在中。感谢您,我还了解到,使用ptx-ptx示例中的nvcc-g--source.cu
我可以获得与C代码交错的ptx中间程序集,这似乎比SASS记录得更好(参见ptx-ISA)。
cuobjdump -sass --function _Z6kernelv example.cubin
code for sm_30
Function : _Z6kernelv
.headerflags @"EF_CUDA_SM30 EF_CUDA_PTX_SM(EF_CUDA_SM30)"
/*0000*/ MOV R1, c[0x0][0x44]; /* 0x2800400110005de4 */
/*0008*/ ISUB R1, R1, 0x8; /* 0x4800c00020105d03 */
/*0010*/ S2R R0, SR_LMEMHIOFF; /* 0x2c000000dc001c04 */
/*0018*/ ISETP.GE.AND P0, PT, R1, R0, PT; /* 0x1b0e00000011dc23 */
/*0020*/ @P0 BRA 0x30; /* 0x40000000200001e7 */
/*0028*/ BPT.TRAP 0x1; /* 0xd00000000400c007 */
/*0030*/ IADD R0, R1, RZ; /* 0x48000000fc101c03 */
/*0038*/ MOV R2, R0; /* 0x2800000000009de4 */
/*0040*/ MOV R3, RZ; /* 0x28000000fc00dde4 */
/*0048*/ MOV R2, R2; /* 0x2800000008009de4 */
/*0050*/ MOV R3, R3; /* 0x280000000c00dde4 */
/*0058*/ MOV R4, c[0x0][0x24]; /* 0x2800400090011de4 */
/*0060*/ MOV R5, RZ; /* 0x28000000fc015de4 */
/*0068*/ IADD R2.CC, R2, R4; /* 0x4801000010209c03 */
/*0070*/ IADD.X R3, R3, R5; /* 0x480000001430dc43 */
/*0078*/ MOV32I R4, 0xff; /* 0x18000003fc011de2 */
/*0080*/ MOV R5, RZ; /* 0x28000000fc015de4 */
/*0088*/ MOV R4, R4; /* 0x2800000010011de4 */