cudnn的section介绍

news2024/9/29 23:33:36

cudnn的section介绍

cuDNN(CUDA Deep Neural Network library)是NVIDIA提供的用于加速深度学习框架中的卷积操作的库,特别适用于运行在CUDA平台上的GPU。

cudnn主要的二进制文件

cuDNN (CUDA Deep Neural Network) 库包含多个二进制文件,每个文件负责加速深度学习任务中的不同操作,特别是卷积、归一化、激活等神经网络操作。这些二进制文件主要是动态链接库文件(.so 文件),存储了针对不同任务的具体实现。以下是 cuDNN 库的主要二进制文件及其结构和作用的详细介绍:

  1. libcudnn.so (主文件)

    cudnn的核心库文件,包含了几乎所有的 API 实现。这个文件提供了用于深度学习任务的核心函数,比如卷积、激活、归一化、池化、RNN等操作的实现。

  2. libcudnn_ops_infer.so

    cuDNN的推理库文件,专门为推理阶段的操作进行优化。它包含了用于前向推理(inference)的高效实现,适用于推理时的神经网络操作。

  3. libcudnn_ops_train.so

    cuDNN训练库文件,专门为训练阶段的操作进行优化。与推理不同,训练阶段涉及到反向传播和梯度计算,因此这个库包含了与训练相关的函数和API。

  4. libcudnn_cnn_infer.so
    用于卷积神经网络(CNN)推理的优化库。该文件针对卷积操作进行了大量优化,特别是在推理阶段的卷积计算。

  5. libcudnn_cnn_train.so
    用于卷积神经网络(CNN)训练的优化库。该文件与libcudnn_ops_train.so类似,但专门针对卷积操作的训练进行了优化。

  6. libcudnn_adv_infer.so
    提供了高级推理操作 ,针对更复杂的神经网络模型,提供了额外的优化。它可能包括更复杂的卷积算法或其他推理阶段的高级特性。

  7. libcudnn_adv_train.so
    提供高级训练操作的库,特别是针对大规模、复杂的神经网络训练任务。

  8. libcudnn_static.a

    cuDNN的静态链接库版本。与.so 文件不同,静态库会在编译时直接链接到应用程序中,而不是在运行时动态加载。

  9. 调试与辅助库

  • cuDNN 库通常还会包含一些调试版本的库文件,它们可能包含更多的调试符号和调试信息,用于在开发和调试深度学习模型时使用。这些库的文件名可能以 -dbg 结尾,包含更多的 .debug.symtab 段,便于调试工具解析符号和源代码信息。
本文以 libcudnn.so 文件为例,详细介绍其常见的section.

使用 objdump 工具查看 cuDNN 库的所有 section:

 objdump -h /usr/lib/x86_64-linux-gnu/libcudnn.so
/usr/lib/x86_64-linux-gnu/libcudnn.so:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .note.gnu.build-id 00000024  00000000000001c8  00000000000001c8  000001c8  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .gnu.hash     00000960  00000000000001f0  00000000000001f0  000001f0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .dynsym       000020d0  0000000000000b50  0000000000000b50  00000b50  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .dynstr       00002354  0000000000002c20  0000000000002c20  00002c20  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  4 .gnu.version  000002bc  0000000000004f74  0000000000004f74  00004f74  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .gnu.version_d 00000030  0000000000005230  0000000000005230  00005230  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  6 .gnu.version_r 00000100  0000000000005260  0000000000005260  00005260  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .rela.dyn     000000f0  0000000000005360  0000000000005360  00005360  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .rela.plt     000006d8  0000000000005450  0000000000005450  00005450  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  9 .init         0000001a  0000000000005b28  0000000000005b28  00005b28  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 10 .plt          000004a0  0000000000005b50  0000000000005b50  00005b50  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 11 .plt.got      00000010  0000000000005ff0  0000000000005ff0  00005ff0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 12 .text         00014566  0000000000006000  0000000000006000  00006000  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 13 .fini         00000009  000000000001a568  000000000001a568  0001a568  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
 14 .rodata       000021c4  000000000001a578  000000000001a578  0001a578  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 15 .eh_frame_hdr 00000ac4  000000000001c73c  000000000001c73c  0001c73c  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 16 .eh_frame     00004ef4  000000000001d200  000000000001d200  0001d200  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 17 .gcc_except_table 000013fc  00000000000220f4  00000000000220f4  000220f4  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 18 .init_array   00000008  0000000000223d30  0000000000223d30  00023d30  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 19 .fini_array   00000008  0000000000223d38  0000000000223d38  00023d38  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 20 .jcr          00000008  0000000000223d40  0000000000223d40  00023d40  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 21 .data.rel.ro  00000008  0000000000223d48  0000000000223d48  00023d48  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 22 .dynamic      00000280  0000000000223d50  0000000000223d50  00023d50  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 23 .got          00000030  0000000000223fd0  0000000000223fd0  00023fd0  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 24 .got.plt      00000260  0000000000224000  0000000000224000  00024000  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 25 .data         0000000c  0000000000224260  0000000000224260  00024260  2**3
                  CONTENTS, ALLOC, LOAD, DATA
 26 .bss          00001158  0000000000224280  0000000000224280  0002426c  2**5
                  ALLOC

各个 Section 的详细介绍

  1. .note.gnu.build-id (Section 0)

    • 用途:这个 section 通常包含构建工具生成的唯一构建 ID。用于调试或验证目的,帮助唯一标识不同的编译版本。
  2. .gnu.hash (Section 1)

    • 用途:用于动态链接时的符号查找,存储哈希表。GNU hash 提高了符号查找效率,尤其在动态库中。
  3. .dynsym (Section 2)

    • 用途:动态符号表,用于在动态链接时查找和解析符号。这是库中所有导出符号(如函数、全局变量等)的列表。
  4. .dynstr (Section 3)

    • 用途:字符串表,用于存储符号表中的符号名称。符号名称在动态链接时通过这个段来访问。
  5. .gnu.version (Section 4)

    • 用途:符号版本信息。此段用于跟踪和管理 ELF 文件中的符号版本,确保正确的符号被解析。
  6. .gnu.version_d (Section 5)

    • 用途:符号版本定义,记录符号的版本声明。它与 .gnu.version 一起工作,用于跟踪符号的版本变化。
  7. .gnu.version_r (Section 6)

    • 用途:符号版本需求,描述此库所依赖的符号版本。
  8. .rela.dyn (Section 7)

    • 用途:动态重定位条目。当加载库时,重定位表帮助调整符号和数据的地址。
  9. .rela.plt (Section 8)

    • 用途:为 PLT(Procedure Linkage Table)提供重定位信息,处理延迟绑定的函数调用。
  10. .init (Section 9)

    • 用途:初始化代码。通常在程序启动时执行,用于初始化全局状态或资源。
  11. .plt (Section 10)

    • 用途PLT 段用于延迟绑定函数调用。当程序调用某个外部库函数时,函数的实际地址会通过这个段解析。
  12. .plt.got (Section 11)

    • 用途GOT(全局偏移量表)与 PLT 共同用于延迟绑定的函数调用。
  13. .text (Section 12)

    • 用途:这是最重要的段,包含了库的可执行代码。cuDNN 的所有 CPU 端功能都在这里实现,部分与 GPU kernel 的调用有关。
  14. .fini (Section 13)

    • 用途:终结代码。通常在程序结束时执行,用于清理资源或做最后的处理。
  15. .rodata (Section 14)

    • 用途:只读数据段,通常用于存储常量和字符串等不可修改的数据。
  16. .eh_frame_hdr.eh_frame (Section 15, 16)

    • 用途:用于异常处理的堆栈展开信息,特别是在 C++ 程序中的异常处理机制中使用。
  17. .gcc_except_table (Section 17)

    • 用途:异常处理时用于栈展开的辅助数据,通常是由 GCC 编译器生成。
  18. .init_array (Section 18)

    • 用途:存储程序初始化时需要执行的函数指针(构造函数)。
  19. .fini_array (Section 19)

    • 用途:存储程序终结时需要执行的函数指针(析构函数)。
  20. .jcr (Section 20)

    • 用途:Java 类注册表(JCR),用于 Java 异常处理的辅助数据,非 Java 程序不会使用。
  21. .data.rel.ro (Section 21)

    • 用途:已初始化但只读的全局数据(通过重定位后的只读数据)。
  22. .dynamic (Section 22)

    • 用途:存储动态链接信息,包括库的依赖关系和符号表信息。帮助动态链接器解析符号。
  23. .got (Section 23)

    • 用途:全局偏移量表,存储动态链接时需要的符号地址。
  24. .got.plt (Section 24)

    • 用途:与 PLT 配合,动态解析函数地址,主要用于延迟绑定。
  25. .data (Section 25)

    • 用途:存储已初始化的全局变量和静态变量。
  26. .bss (Section 26)

    • 用途:存储未初始化的全局变量和静态变量。在程序启动时,这些变量会被初始化为 0。

GPU Kernel 位置和分布

  1. GPU kernel 调用流程
    • GPU kernel 的实际代码并不直接存储在 .text 段中。CUDA 动态库的 GPU kernel 通常会通过 CUDA Runtime API 调用并从 .nv_fatbin 或其他特定段中加载。在这里,我们没有看到 .nv_fatbin,因为其在运行时动态加载。
  2. GPU kernel 的加载和执行
    • 虽然在 objdump 输出中没有显示 .nv_fatbin 段,但 GPU kernel 的调用逻辑会通过 .text 段中的 CPU 端代码调用 CUDA API(如 cudaLaunchKernel),这些 API 会进一步加载对应的 GPU kernel 并将其传递到 GPU 上执行。
    • 如果要查看具体的 GPU kernel 代码,可以使用 cuobjdump 工具提取和查看这些 kernel 的 PTX 或 SASS 代码。

注:上述结果的实验环境

1. 操作系统版本

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:        18.04
Codename:       bionic

2. nvcc 版本

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2020 NVIDIA Corporation
Built on Mon_Nov_30_19:08:53_PST_2020
Cuda compilation tools, release 11.2, V11.2.67
Build cuda_11.2.r11.2/compiler.29373293_0

3. cudnn 版本

ii  libcudnn8                              8.8.0.121-1+cuda11.8                amd64        cuDNN runtime libraries
ii  libcudnn8-dev                          8.8.0.121-1+cuda11.8                amd64        cuDNN development libraries and headers
ii  libcudnn8-samples                      8.8.0.121-1+cuda11.8                amd64        cuDNN samples


Ref

  1. https://docs.nvidia.com/deeplearning/cudnn/index.html
  2. https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html
  3. https://developer.nvidia.com/nsight-systems
  4. https://docs.nvidia.com/cuda/cuda-binary-utilities/index.html#cuobjdump-overview

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通信工程学习:什么是SISO单入单出

SISO:单入单出 SISO,即单输入单输出(Single-Input Single-Output)系统,也被称为单变量系统。在这种系统中,输入量与输出量各为一个,是控制理论中的一个基本概念。以下是对SISO系统的详细解释&am…

为什么说函数传递参数最好小于四个

有一个说法说是函数传递参数最好不超过四个,原因有一个是参数太多难以维护,另一个重要的原因就是函数传递小于四个参数时候效率会更高,其实这个说法也不全对,在不同的结构下不太一样,也不一定是4 其实那么下面将探究函…

【RocketMQ】消费失败重试与死信消息

🎯 导读:本文档详细介绍了RocketMQ中的重试机制与死信消息处理方法。对于生产者而言,文档提供了如何配置重试次数的具体示例;而对于消费者,它解释了默认情况下消息消费失败后的重试策略,并展示了如何通过代…

STM32LL库之printf函数重定向

1. 加入以下代码 int fputc(int ch,FILE *f) {LL_USART_TransmitData8(USART1,ch);while(!LL_USART_IsActiveFlag_TXE(USART1));//需要等待发送完成return(ch); }记得添加 stdio.h 头文件 2. 在MDK中勾选:Use MicroLIB

C++【类和对象】(取地址运算符重载与实现Date类)

文章目录 取地址运算符重载const成员函数取地址运算符重载 Date类的实现Date.hDate.cpp1.检查日期合法性2. 构造函数/赋值运算符重载3.得到某月的天数4. Date类 - 天数的操作4.1 日期 天数4.2 日期 天数4.3 日期 - 天数4.4 日期 - 天数 5. Date的前后置/--5.1 前置5.2 后置5.…

学习鸿蒙HarmongOS(基础一)

最近听到一个朋友在干鸿蒙系统开发,于是我也来看看,我看到的第一感觉和前端TS好像,鸿蒙的是叫ArkTS,于是来看一下视频,学习了一下,我的随手笔记记录一下吧,方便我以后阅读 基本 语句 函数

unity3D雨雪等粒子特效不穿透房屋效果实现

做项目有时候会做天气模拟,模拟雨雪天气等等。但是容易忽略一个问题,就是房屋内不应该下雨或者下雪,这样不就穿帮了嘛。 下面就粒子穿透物体问题做一个demo。 正常下雨下雪在室内的话,你可以看到,粒子是穿透建筑的。…

【C++篇】启航——初识C++(上篇)

目录 引言 一、C的起源和发展史 1.起源 2.C版本更新 二、C在⼯作领域中的应⽤ 三、C入门建议 1.参考文档 2.推荐书籍 四、C的第一个程序 1.C语言写法 2.C写法 五、命名空间 1.为什么要有命名空间 2.定义命名空间 3.主要特点 4.使用示例 六、C输⼊&输出 …

C程序设计——结构化程序设计的三种结构

前面我说过:“结构化编程语言,用语法限制程序员,只能使用顺序、选择、循环三种结构来解决问题。” 接下来,就讲解这三种结构。 顺序结构 前面我讲过,C语言所有的程序,都必须有一个 main 函数&#xff0c…

TCP\IP标准与OSI标准

TCP/IP 模型和 OSI 模型都是用于描述网络体系结构的模型,但它们的设计理念和层次结构有所不同。TCP/IP 模型更注重实际实现,而 OSI 模型更注重抽象和标准化。 1. OSI 模型 (Open Systems Interconnection Model) OSI 模型是一个七层模型,从…

828华为云征文|部署在线论坛网站 Flarum

828华为云征文|部署在线论坛网站 Flarum 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Flarum3.1 Flarum 介绍3.2 Flarum 部署3.3 Flarum 使用 四、总结 一、…

针对考研的C语言学习(定制化快速掌握重点2)

1.C语言中字符与字符串的比较方法 在C语言中&#xff0c;单字符可以用进行比较也可以用 > , < ,但是字符串却不能用直接比较&#xff0c;需要用strcmp函数。 strcmp 函数的原型定义在 <string.h> 头文件中&#xff0c;其定义如下&#xff1a; int strcmp(const …

Vue.js组件开发指南

Vue.js组件开发指南 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;用于构建用户界面。它的核心是基于组件的开发模式。通过将页面分解为多个独立的、可复用的组件&#xff0c;开发者能够更轻松地构建复杂的应用。本文将深入探讨 Vue.js 组件开发的基础知识&#xff0c;并…

基于springoot新能源充电系统的设计与实现

新能源充电系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统新能源充电系统信息管理难度…

国产纯电SUV都在秀,只有Model Y在挨揍

文/王俣祺 导语&#xff1a;如果想知道纯电SUV应该怎么选&#xff0c;一定有人告诉你“无脑选Model Y”&#xff0c;虽说特斯拉确实粉丝多&#xff0c;但这也恰恰证明Model Y一度成为了纯电SUV的标杆。有标杆自然就有挑战者&#xff0c;随着阿维塔07、智己LS6以及乐道L60先后上…

云南省职业院校技能大赛赛项规程(软件测试)

赛项名称&#xff1a;软件测试 英文名称&#xff1a;Software Testing 赛项组别&#xff1a;高等职业教育 赛项编号&#xff1a;GZ034 目录 一、 赛项信息 二、竞赛目标 三、竞赛内容 1、本赛项考查的技术技能和涵盖的职业典型工作任务 2、专业核心能力与职业综合能力…

商标名称注册查询,到底是查询什么!

在商标注册前是需要商标名称注册查询&#xff0c;那这个到底是查询什么&#xff0c;普推知产商标老杨发现&#xff0c;近日国家知产局发布《商标代理委托合同示范文本》征求意见稿&#xff0c;虽然是参考使用不具有强制性&#xff0c;里面对商标名称注册查询描述是申请前商标检…

完成UI界面的绘制

绘制UI 接上文&#xff0c;在Order90Canvas下创建Image子物体&#xff0c;图片资源ui_fish_lv1&#xff0c;设置锚点&#xff08;CountdownPanelImg同理&#xff09;&#xff0c;命名为LvPanelImg,创建Text子物体&#xff0c;边框宽高各50&#xff0c; &#xff0c;重名为LvT…

阻焊层解析:PCB的“保护伞”是什么?

在电子制造行业中&#xff0c;尤其是PCBA贴片加工领域&#xff0c;阻焊层是一个重要的概念。以下是对阻焊层的详细讨论分析&#xff0c;包括其定义、作用以及类型。 阻焊层的定义 阻焊层&#xff0c;顾名思义&#xff0c;是一种用于阻止焊接的材料层。在PCB&#xff08;印刷电…