解析CUDA FATBIN格式

参考文档:

https://pdfs.semanticscholar.org/5096/25785304410039297b741ad2007e7ce0636b.pdf

CUDA Pro Tip: Understand Fat Binaries and JIT Caching | NVIDIA Technical Blog

cuda二进制文件中到底有什么 - 知乎

NVIDIA CUDA Compiler Driver

NVIDIA CUDA Compiler Driver

https://docs.nvidia.com/cuda/pdf/CUDA_Compiler_Driver_NVCC.pdf

cuda二进制文件中到底有些什么_真是使用gpu的二进制文件-CSDN博客

分析过程

首先编译一个CUDA程序,编译结果为标准的ELF文件,所以可以用binutils工具分析,查看可执行文件的section有那些。

$ readelf -S a.out 
There are 35 section headers, starting at offset 0xa0fd8:

节头:
  [号] 名称              类型             地址              偏移量
       大小              全体大小          旗标   链接   信息   对齐
  [ 0]                   NULL             0000000000000000  00000000
       0000000000000000  0000000000000000           0     0     0
  [ 1] .interp           PROGBITS         0000000000000270  00000270
       000000000000001c  0000000000000000   A       0     0     1
  [ 2] .note.ABI-tag     NOTE             000000000000028c  0000028c
       0000000000000020  0000000000000000   A       0     0     4
  [ 3] .note.gnu.build-i NOTE             00000000000002ac  000002ac
       0000000000000024  0000000000000000   A       0     0     4
  [ 4] .gnu.hash         GNU_HASH         00000000000002d0  000002d0
       000000000000001c  0000000000000000   A       5     0     8
  [ 5] .dynsym           DYNSYM           00000000000002f0  000002f0
       0000000000000eb8  0000000000000018   A       6     1     8
  [ 6] .dynstr           STRTAB           00000000000011a8  000011a8
       0000000000000796  0000000000000000   A       0     0     1
  [ 7] .gnu.version      VERSYM           000000000000193e  0000193e
       000000000000013a  0000000000000002   A       5     0     2
  [ 8] .gnu.version_r    VERNEED          0000000000001a78  00001a78
       0000000000000150  0000000000000000   A       6     8     8
  [ 9] .rela.dyn         RELA             0000000000001bc8  00001bc8
       00000000000037e0  0000000000000018   A       5     0     8
  [10] .rela.plt         RELA             00000000000053a8  000053a8
       0000000000000e10  0000000000000018  AI       5    27     8
  [11] .init             PROGBITS         00000000000061b8  000061b8
       0000000000000017  0000000000000000  AX       0     0     4
  [12] .plt              PROGBITS         00000000000061d0  000061d0
       0000000000000970  0000000000000010  AX       0     0     16
  [13] .plt.got          PROGBITS         0000000000006b40  00006b40
       0000000000000008  0000000000000008  AX       0     0     8
  [14] .text             PROGBITS         0000000000006b50  00006b50
       00000000000547fe  0000000000000000  AX       0     0     16
  [15] .fini             PROGBITS         000000000005b350  0005b350
       0000000000000009  0000000000000000  AX       0     0     4
  [16] .rodata           PROGBITS         000000000005b360  0005b360
       000000000000916c  0000000000000000   A       0     0     32
  [17] .nv_fatbin        PROGBITS         00000000000644d0  000644d0
       0000000000000d28  0000000000000000   A       0     0     8
  [18] __nv_module_id    PROGBITS         00000000000651f8  000651f8
       000000000000000f  0000000000000000   A       0     0     8
  [19] .eh_frame_hdr     PROGBITS         0000000000065208  00065208
       0000000000002a8c  0000000000000000   A       0     0     4
  [20] .eh_frame         PROGBITS         0000000000067c98  00067c98
       00000000000093e8  0000000000000000   A       0     0     8
  [21] .gcc_except_table PROGBITS         0000000000071080  00071080
       0000000000000010  0000000000000000   A       0     0     1
  [22] .tbss             NOBITS           0000000000271da0  00071da0
       0000000000000298  0000000000000000 WAT       0     0     8
  [23] .init_array       INIT_ARRAY       0000000000271da0  00071da0
       0000000000000098  0000000000000008  WA       0     0     8
  [24] .fini_array       FINI_ARRAY       0000000000271e38  00071e38
       0000000000000008  0000000000000008  WA       0     0     8
  [25] .data.rel.ro      PROGBITS         0000000000271e40  00071e40
       0000000000002a70  0000000000000000  WA       0     0     32
  [26] .dynamic          DYNAMIC          00000000002748b0  000748b0
       0000000000000260  0000000000000010  WA       6     0     8
  [27] .got              PROGBITS         0000000000274b10  00074b10
       00000000000004f0  0000000000000008  WA       0     0     8
  [28] .data             PROGBITS         0000000000275000  00075000
       0000000000000058  0000000000000000  WA       0     0     32
  [29] .nvFatBinSegment  PROGBITS         0000000000275058  00075058
       0000000000000030  0000000000000000  WA       0     0     8
  [30] .bss              NOBITS           00000000002750a0  00075088
       00000000000014c0  0000000000000000  WA       0     0     32
  [31] .comment          PROGBITS         0000000000000000  00075088
       00000000000003ef  0000000000000000           0     0     1
  [32] .symtab           SYMTAB           0000000000000000  00075478
       000000000000f0c0  0000000000000018          33   1561     8
  [33] .strtab           STRTAB           0000000000000000  00084538
       000000000001c952  0000000000000000           0     0     1
  [34] .shstrtab         STRTAB           0000000000000000  000a0e8a
       000000000000014e  0000000000000000           0     0     1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
  L (link order), O (extra OS processing required), G (group), T (TLS),
  C (compressed), x (unknown), o (OS specific), E (exclude),
  l (large), p (processor specific)

出现了三个普通ELF文件中没有的段:

它们分别是.nv_fatbin,__nv_module_id和.nvFatBinSegment三个段.进一步分析,.nv_fatbin和__nv_module_id属性是READONLY,而.nvFatBinSegment则是DATA,说明运行时.nv_fatbin和__nv_module_id为只读,而.nvFatBinSegment支持读写,说明CUDA的代码保存在nv_fatbin中,而nvFatBinSegment则放在数据段。

查看program header确实如此,.nv_fatbin __nv_module_id被放在只读R属性的segment,而.nvFatBinSegment和BSS,.data之类放在一起,是可读写的。

CUDA运行时的秘密就隐藏在这三个段中,分别解析,先从简单的入手,__nv_module_id只有15个字节,其内容是一组字符串,内容如其名,是描述信息,执行时的作用可能不大。

nvFatBinSegment 段文档中这样描述:

根据描述,nvFatBinSegment中保存的是CUDA程序的元数据,元数据是数据的数据,究竟是什么数据的数据,看来只能是描述CUDA程序的数据了,而前面分析CUDA程序在fatbin中,所以nvFatBinSegment段应该就是对fatbin的描述。

根据文档的描述,nvFatBinSegment 每6个word(24字节)为一组,其中每组第三个word为代码段在fatbin中的地址,并且nvFatBinSegment中的描述和fatbin要始终对应一致。

按照文档解析nvFatBinSegment,一共有两组,分别描述了fatbin中的两个代码区,地址能够对应的上。

仔细观察发现,每个GROUP内似乎都有一个ELF文件的,将其抠出来:

如下命令进行ELF hack,可以看到扣出的两个文件可以被解析,说明其确实是ELF文件,并且是CUDA ARCH:

objcopy -O binary --only-section .nv_fatbin a.out fat.bin
dd if=./fat.bin bs=1 skip=80 count=696 of=fat1.elf
dd if=./fat.bin bs=1 skip=776 of=fat2.elf

查看符号信息,fat1.elf没有有效内容,而FAT2.ELF中则存在写的KERNEL ADD函数的代码段:

反编译elf,fat1.elf没有指令,fat2.elf中包含了ADD的机器指令,从反编译的二进制可以看到这里的CUDA ISA是8个字节,也就是64BIT指令。

分析KERNEL流程:

$ nvdisasm -cfg fat2.elf|dot -ocfg.png -Tpng

文档中对FATBIN的描述,可见其确实包含多组ELF文件,至于为何多组ELF,多组的目的是什么,目前还是不甚了解。


End

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/503834.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HSP_04章_扩展: 进制、位运算

文章目录 10. 扩展: 进制11. 位运算11.1 二进制在运算中的说明11.2 原码 反码 补码11.3位运算符11.3.1 ~按位取反11.3.2 &按位与11.3.3 ^按位异或11.3.4 |按位或11.3.5 << 左移11.3.6 >> 右移 10. 扩展: 进制 进制介绍 进制的转换 2.1 其他进制转十进制 二进…

(八)目标跟踪中参数估计(似然、贝叶斯估计)理论知识

目录 前言 一、统计学基础知识 &#xff08;一&#xff09;随机变量 &#xff08;二&#xff09;全概率公式 &#xff08;三&#xff09;高斯分布及其性质 二、似然是什么&#xff1f; &#xff08;一&#xff09;概率和似然 &#xff08;二&#xff09;极大似然估计 …

国内顶级大牛整理:分布式消息中间件实践笔记+分布式核心原理解析

XMPP JMS RabbitMQ 简介 工程实例 Java 访问RabbitMQ实例 Spring 整合RabbitMQ 基于RabbitMQ的异步处理 基于RabbitMQ的消息推送 RabbitMQ实践建议 虚拟主机 消息保存 消息确认模式 消费者应答 流控机制 通道 总结 ActiveMQ 简介 工程实例 Java 访问ActiveMQ实例…

机器人寻路算法双向A*(Bidirectional A*)算法的实现C++、Python、Matlab语言

机器人寻路算法双向A*&#xff08;Bidirectional A*&#xff09;算法的实现C、Python、Matlab语言 最近好久没更新&#xff0c;在搞华为的软件挑战赛&#xff08;软挑&#xff09;&#xff0c;好卷只能说。去年还能混进32强&#xff0c;今年就比较迷糊了&#xff0c;这东西对我…

EasyRecovery2024汉化精简版,无需注册

EasyRecovery2024是世界著名数据恢复公司 Ontrack 的技术杰作&#xff0c;它是一个威力非常强大的硬盘数据恢复软件。能够帮你恢复丢失的数据以及重建文件系统。 EasyRecovery不会向你的原始驱动器写入任何东东&#xff0c;它主要是在内存中重建文件分区表使数据能够安全地传输…

FL Studio21.2.3中文版软件新功能介绍及下载安装步骤教程

FL Studio21.2中文版的适用人群非常广泛&#xff0c;主要包括以下几类&#xff1a; FL Studio 21 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 Mac-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55982 音乐制作人&#xff1a…

C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码

C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码 手麻系统从麻醉医生实际工作环境和流程需求方面设计&#xff0c;与HIS&#xff0c;LIS&#xff0c;PACS&#xff0c;EMR无缝连接&#xff0c;方便查看患者的信息;实现术前、术中、术后手术麻醉信息全记录;减少麻醉医师在…

Spring Boot配置⽂件的格式

1、Spring Boot 配置⽂件有以下三种&#xff1a; &#xff08;1&#xff09;application.properties &#xff08;2&#xff09;application.yml &#xff08;3&#xff09;application.yaml 2、yml 为yaml的简写, 实际开发中出现频率最⾼. yaml 和yml 的使⽤⽅式⼀样 3、 4…

Vue + .NetCore前后端分离,不一样的快速发开框架

摘要&#xff1a; 随着前端技术的快速发展&#xff0c;Vue.NetCore框架已成为前后端分离开发中的热门选择。本文将深入探讨Vue.NetCore前后端分离的快速开发框架&#xff0c;以及它如何助力开发人员提高效率、降低开发复杂度。文章将从基础功能、核心优势、适用范围、依赖环境等…

软考之零碎片段记录(一)

2023上半年选择题 一、流水线周期 注&#xff1a;&#xff08;n-1) * 流水线周期 &#xff08;取址时间分析时间执行时间&#xff09; 注&#xff1a;流水线周期&#xff1a;指令中最耗时的部分&#xff08;取址或者分析或者执行&#xff09; # 耗时最高的部分 * &#xff0…

单例设计模式(3)

单例模式&#xff08;3&#xff09; 实现集群环境下的分布式单例类 如何理解单例模式中的唯一性&#xff1f; 单例模式创建的对象是进程唯一的。以springboot应用程序为例&#xff0c;他是一个进程&#xff0c;可能包含多个线程&#xff0c;单例代表在这个进程的某个类是唯一…

Unity 基于Rigidbody2D模块的角色移动

制作好站立和移动的动画后 控制器设计 站立 移动 角色移动代码如下&#xff1a; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine;public class p1_c : MonoBehaviour {// 获取动画组件private Animator …

LeetCode Python - 84. 柱状图中最大的矩形

目录 题目描述解法方法一方法二 运行结果方法一方法二 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights …

《最小阻力之路》利用最小阻力路径,采用创造性思维模式,更有效地实现个人愿景和目标 - 三余书屋 3ysw.net

最小阻力之路 大家好&#xff0c;今天我们分享《最小阻力之路》。我们时常听到有人感叹&#xff0c;明明懂得那么多道理&#xff0c;为何生活过得不如意呢&#xff1f;这本书从某种角度回应了这个疑问&#xff0c;作者分析了我们在人生旅途中屡次失败的原因&#xff0c;提出了…

图像分割论文阅读:Automatic Polyp Segmentation via Multi-scale Subtraction Network

这篇论文的主要内容是介绍了一种名为多尺度差值网络&#xff08;MSNet&#xff09;的自动息肉分割方法。 1&#xff0c;模型整体结构 整体结构包括编码器&#xff0c;解码器&#xff0c;编码器和解码器之间是多尺度差值模块模块&#xff08;MSM&#xff09;&#xff0c;以及一…

使用Python实现ID3决策树中特征选择的先后顺序,字节跳动面试真题

def empty1(pri_data): hair [] #[‘长’, ‘短’, ‘短’, ‘长’, ‘短’, ‘短’, ‘长’, ‘长’] voice [] #[‘粗’, ‘粗’, ‘粗’, ‘细’, ‘细’, ‘粗’, ‘粗’, ‘粗’] sex [] #[‘男’, ‘男’, ‘男’, ‘女’, ‘女’, ‘女’, ‘女’, ‘女’] for o…

刷题日记——国家名称排序

7.国家名称排序 分析 一开始打算用二维的字符数组来操作&#xff0c;但是数组指针玩不太明白&#xff0c;于是改用结构体&#xff0c;结构体country里面仅一个成员name&#xff08;字符数组&#xff09;&#xff0c;这样就有两种解题方法&#xff1a; 方法一&#xff1a;使用…

数字化时代多系统安全运维解决方案

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&…

Google 邀请您参加 Build with AI 2024 线下活动

AI 技术正真实地影响并重构着当下的一切&#xff0c;在这个充满无限可能的领域&#xff0c;我们坚信开放的理念和大家的共同努力将推动我们不断创新。现在&#xff0c;Google 诚挚地邀请从事不同工作的开发者参与我们的 Build with AI 2024 线下活动&#xff0c;一同探索 Googl…

软考高级架构师:区块链技术概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…