cuda binary

1.Overview

1.1什么是CUDA二进制文件

cuda 二进制文件 (.cubin .elf)是一种 ELF格式的文件,其中包含可执行代码部分,还包含了一些 符号、relocator、debug 信息等其他内容。

默认情况下,CUDA编译器 nvcc 可以讲cubin 文件,嵌入到 host 的可执行文件中。也可以 使用 nvcc -cubin 来编译直接得到 x.cubin 文件。

注意: 更多细节参见 nvcc 的用法。

1.2两种反编译工具

两个 反编译工具: cuobjdump and nvdisasm

1.2.1 相同点:都可以 反编译 .cubin 文件

1.2.2 不同点: 1.cuobjdump可以 从 各种 二进制文件中,提取出 .ptx 代码 和 cubin 代码 其中 包括 :1)Host binaries

Executables
Object files
Static libraries

2)External fatbinary files

nvdisasm 则不能。

2.nvdisasm 可以进行 控制流分析并输出 和 显示高级选型

2.cuobjdump

2.1用法

格式 : 命令 选项 文件cuobjdump accepts a single input file each time it’s run. The basic usage is as following:

cuobjdump [options] <file>

反编译->得到 sass 汇编代码To disassemble a standalone cubin or cubins embedded in a host executable and show CUDA assembly of the kernels, use the following command:

cuobjdump -sass <input file>

提取 elf 代码 To dump cuda elf sections in human readable format from a cubin file, use the following command:

cuobjdump -elf <cubin file>

提取 ptx 代码To extract ptx text from a host binary, use the following command:

cuobjdump -ptx <host binary>

其他常用选项nvidia-CUDA Binary Utilities-2.2. Command-line Options

2.2例子

$ cuobjdump a.out  -sass 
Fatbin elf code: 
================ 
arch = sm_20 
code version = [1,7] 
producer = cuda 
host = linux 
compile_size = 64bit i
dentifier = add.cu 
code for sm_20 
Function : _Z3addPiS_S_ 
​
.headerflags @"EF_CUDA_SM20 EF_CUDA_PTX_SM(EF_CUDA_SM20)" 
​
/*0000*/ MOV R1, c[0x1][0x100]; /* 0x2800440400005de4 */ 
/*0008*/ MOV R6, c[0x0][0x20];  /* 0x2800400080019de4 */ 
/*0010*/ MOV R7, c[0x0][0x24];  /* 0x280040009001dde4 */
/*0020*/ MOV R3, c[0x0][0x2c];  /* 0x28004000b000dde4 */ 
/*0030*/ MOV R4, c[0x0][0x30];  /* 0x28004000c0011de4 */
/*0038*/ LDU.E R2, [R2];        /* 0x8c00000000209c85 */ 
/*0050*/ ST.E [R4], R0;         /* 0x9400000000401c85 */ 
/*0058*/ EXIT;                  /* 0x8000000000001de7 */

3.nvdisasm

3.1 Usage

使用格式nvdisasm accepts a single input file each time it’s run. The basic usage is as following:

nvdisasm [options] <input cubin file>

常用选项

  -base  <value>  基地址
  -b  sm的版本
  -plr 打印寄存器的range

更多详见nvidia-CUDA Binary Utilities-3.2. Command-line Options

获取 kernel 的控制流图

To get the control flow graph of a kernel, use the following:

nvdisasm -cfg <input cubin file>

注意:控制流图 需要 Graphviz 中的 dot 命令 ,要先安装在电脑中才可用。 另 cubin 必须是 计算能力 3.0 以上的才可以

3.2 Example

其实 反编译的结果 是类似的

特别的是 其 生成的 控制流图。

eg

 nvdisasm -cfg a.cubin | dot -ocfg.png -Tpng