我不确定我做错了什么,基本上我想得到可读的汇编,与C调用混合。
以下是一些示例代码:
example.cu
#include <stdio.h>
__global__ void kernel()
{
unsigned long a, b, c;
a = 255;
b = 10;
c = a + b;
}
int main(void)
{
cudaFree(0);
kernel<<<1,1>>>();
cudaDeviceSynchronize();
return 0;
}
当我调查cuobjdump -h
时(强调我的):
--dump-sass
(-sass
)
所有列出的设备功能的转储组件。 Cuda来源是 在指定选项 -G 的情况下,将列出的程序集混合 编译期间nvcc
,如果仍然可以找到源文件。
我用它编译它(因此创建了example.cubin
文件):
nvcc -G -cubin -arch=sm_30 --ptxas-options=-v example.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窗口中的调试会话中):
答案 0 :(得分:2)
目前无法使用cuobjdump
。引用的cuobjdump
文档/命令行帮助有误。