nvcc编译器之编译内幕(chapter 23)

news2024/11/18 9:32:47

目录

2. 编译阶段(步骤)

2.1 NVCC预定义宏

2.2 NVCC编译步骤

2.3 NVCC支持的文件后缀

2.4 支持的编译阶段

3. CUDA 编译内幕


2. 编译阶段(步骤)

2.1 NVCC预定义宏

  • __NVCC__

在编译C/C++/CUDA源文件时定义

  • __CUDACC__

在编译CUDA源文件时定义

  • __CUDACC_RDC__

在编译可重定位(relocatable)设备端代码模式时定义(详见6.2章节)

  • __CUDACC_EWP__

在可扩展整个程序模式下编译CUDA源文件时定义(详见4.2.3章节)

  • __CUDACC_DEBUG__

在指定编译debug版本的CUDA源文件时定义(详见4.2.3章节)

  • __CUDACC_RELAXED_CONSTEXPR__

命令行中指定--expt-relaxed-constexpr标志位时定义,详细参阅《cuda C编程指南》

  • __CUDACC_EXTENDED_LAMBDA__

命令行中指定--expt-extended-lambda或者--extended-lambda标志位时定义,详细参阅《cuda C编程指南》

  • __CUDACC_VER_MAJOR__

随nvcc的major版本定义

  • __CUDACC_VER_MINOR__

随nvcc的minor版本定义

  • __CUDACC_VER_BUILD__

随nvcc的构建版本定义

2.2 NVCC编译步骤

nvcc的编译由几个不同的逻辑翻译步骤组成,这可以通过nvcc命令行选项来选择。

一个单独的编译阶段,也可以被NVCC分解成几个不同的步骤,这些步骤合并组成一个编译过程。然而,编译取决于nvcc所使用的(nvcc更像一个编译工具的集成者)内部编译套件,这些编译套件会随着CUDA工具套件的更新而改变。因此,在不同的发行版本中,只有统一的整个编译流程是稳定不变的。nvcc提供了一系列命令行选项来展示编译所执行的不同阶段,但这仅仅用作debug使用,不要拷贝并在构建脚本中使用。因为编译的中间结果依赖于特定的nvcc编译工具套件,多版本之间可能不兼容。

实际上,nvcc的编译除了依赖于编译选项,也依赖于输入文件的后缀。通过输入文件后缀确定编译阶段的输入,通过命令行选项确定编译阶段的输出。2.3章节会介绍NVCC支持的文件后缀,2.4章节会介绍NVCC支持的编译阶段。

2.3 NVCC支持的文件后缀

  • .cu:cuda源文件,包含了host代码和device代码
  • .c:C源文件
  • .cc,.cxx,.cpp:C++源文件
  • .ptx:ptx中间汇编码文件
  • .cubin:cuda设备端可执行二进制码文件(单GPU架构下)
  • .fatbin:cuda fat二进制文件,可以包含多个ptx码和cubin码文件
  • .o,.obj:对象文件
  • .a,.lib:库文件
  • .res: 资源文件
  • .so:动态库文件

2.4 支持的编译阶段

下表介绍支持的编译阶段和相关的命令行选项,以及不同编译阶段的默认输出文件名称(当不使用--output-file选项时):

Phase

nvcc选项

默认输出文件名称

cuda编译到C/C++源文件

--cuda

-cuda

x.cpp.ii,x表示源文件名。该输出文件可以通过host编译器进行后续编译,nvcc使用host编译器对.cu文件进行预处理

C/C++预处理

--preprocess

-E

标准的预处理输出

C/C++编译到目标文件

--compile

-c

x.o(Linux和Mac OS X),x.obj(Windows)

从cuda源文件生成cubin文件

--cubin

-cubin

x.cubin

从ptx中间码生成cubin文件

--cubin

-cubin

x.cubin

从cuda源文件生成ptx中间码文件

--ptx

-ptx

x.ptx

从源文件,ptx或cubin文件生成fatbin文件

--fatbin

-fatbin

x.fatbin

链接生成设备端的可重定位代码

--device-link

-dlink

a_dlink.obj(Windows)或a_dlink.o(Linux, Mac OS X)

从设备端可重定位代码生成设备端cubin二进制

--device-link --cubin

-dlink -cubin

a_dlink.cubin

从设备端可重定位代码生成fatbin

--device-link --fatbin

-dlink -fatbin

a_dlink.fatbin

链接生成可执行文件

无选项

a.out(Linux, Mac OS X)或a.exe(Windows)

目标文件打成包或库

--lib

-lib

a.a(Linux, Mac OS X)或a.lib(Windows)

生成依赖

--generate-dependencies

-M

标准的输出

生成不包含系统path路径的依赖

--generate-nonsystem-dependencies

-MM

标准输出

运行可执行文件

--run

-run

直接运行编译好的可执行文件,无需指定库路径(LD_LIBRARY_PATH)

在不指定具体命令行选项的时候,nvcc编译并链接所有输入的文件。

3. CUDA 编译内幕

cuda编译过程如下:

1) 源程序进行设备端(GPU)代码编译前的预处理,预处理后编译成cuda二进制(cubin)和(或)ptx中间码,放到fatbin文件中
2)源程序进行主机端(CPU)代码编译前的预处理,预处理后合入fatbin进去,并转换所有cuda C++扩展语法到标准的C++语法
3)host主机侧编译器编译合并后的代码(标准C++,以及嵌入了fatbin设备端代码)成目标文件。

当主机(端)程序启动(launch)运行设备端(__global__)代码时,cuda运行时系统会检查嵌入的fatbin代码,并获取适合当前GPU运行的fatbin(也就是说其中可以有支持各个不同架构GPU的fabin码嵌入在host程序中 ?)

cuda程序默认是被整体编译的,即设备端代码(C++文件对外暴露的函数和变量等)无法在另外一个文件中被引用。在整体编译模式下,设备代码的链接步长是无影响的。有关整体编译和分开编译,可以参考第6章节。

CUDA编译原理如下:

 

关于作者:

犇叔,浙江大学计算机科学与技术专业,研究生毕业,而立有余。先后在华为、阿里巴巴和字节跳动,从事技术研发工作,资深研发专家。主要研究领域包括虚拟化、分布式技术和存储系统(包括CPU与计算、GPU异构计算、分布式块存储、分布式数据库等领域)、高性能RDMA网络协议和数据中心应用、Linux内核等方向。

专业方向爱好:数学、科学技术应用

关注犇叔,期望为您带来更多科研领域的知识和产业应用。

内容坚持原创,坚持干货有料。坚持长期创作,关注犇叔不迷路

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

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

相关文章

[附源码]java毕业设计教师教学评价系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

java之你真正了解抽象类和接口嘛?

🎇🎇🎇作者: 小鱼不会骑车 🎆🎆🎆专栏: 《java练级之旅》 🎓🎓🎓个人简介: 一名专科大一在读的小比特,努力学习编程是我…

Nexus私服仓库Linux、Windows部署教程

Nexus 概述 Nexus 是 Sonatype 公司发布的一款仓库(Repository)管理软件,常用来搭建 Maven 私服,所以也有人将 Nexus 称为“Maven仓库管理器”。 主流的 Maven 仓库管理器主要有以下 3 种:Apache Archiva、JFrog Arti…

软考信息安全工程师案列分析

1.第一题 1.动态存储区,分配存储空间和释放存储空间 3.让argv[]中的第9个字符是十进制65即可。 4.缓冲区溢出漏洞,使用安全的strcpy函数,检测边界 第二题 第三题 1.保证M完整性 不能交换,先hash摘要可以减少加密的计算量。 2.实现…

STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例

STM8S系列基于STVD开发,自定义printf函数TIM5精确延时函数模块化工程示例🎬功能演示 ✨本例也是结合了网络上收集来的printf自定义内容,将其功能模块化,方便移植使用,灵活性很强。 📚相关篇内容《STM8S903…

leetcode:792. 匹配子序列的单词数【子序列二分优化模板 + 大的字符串不变的二分优化】

目录题目截图题目分析ac code总结题目截图 题目分析 简单的子序列判断需要on,那么最后最坏就是omn,25 * 10 ^ 7爆炸因此需要优化子序列判断注意到此时的大字符串是同一个记录每个字母出现的下标遍历word,找到下一个最近的字母出现的位置&…

C++【C++11】

文章目录一、统一的列表初始化1.用{}来初始化元素2.initializer_list二、自动类型推断3.auto4.decltype三、指针5.nullptr6.范围for四、STL中的一些新变化1.新增加的容器2.容器内部的变化一、统一的列表初始化 1.用{}来初始化元素 在C98中,标准允许使用花括号{}对…

搭建java部署环境以及部署Web项目到Linux

系列文章目录 Linux 环境搭建以及xshell远程连接_crazy_xieyi的博客-CSDN博客 Linux常用命令详解_crazy_xieyi的博客-CSDN博客 Linux权限_crazy_xieyi的博客-CSDN博客 文章目录 一、搭建java部署环境 1.yum 2.JDK 3.Maven 4.Tomcat 5.MySQL二、部署…

PacBio三代全长扩增子测序对珊瑚共生虫黄藻和细菌群落进行精确分类

研究背景 珊瑚与其共生微生物群落统称为珊瑚共生功能体,包含了光合甲藻以及与其保持长期互利共生关系的细菌、古菌、真菌、原生动物以及病毒等一系列微生物。这些与珊瑚相关的微生物在其宿主的适应性和生存中起着重要的作用。本研究利用PacBio全长16S rRNA和ITS测序…

【Spring】一文带你吃透Spring集成MyBatis

个人主页: 几分醉意的CSDN博客_传送门 文章目录💖Spring集成MyBatis✨怎么使用mybatis✨集成的步骤✨创建数据库表✨pom加入依赖✨创建MyBatis使用代码✨创建Service类✨创建Spring配置文件✨测试集成MyBatis✨使用外部属性配置文件💖投票传送…

HTML西安旅游网页设计作业成品 大学生旅游风景区网页设计作业模板下载 静态HTML旅游景点网页制作下载 DW网页设计代码

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

Redis主从复制

安装redis 下载redis源码: wget http://download.redis.io/releases/redis-3.2.3.tar.gz 解压安装redis: tar zxf redis-3.2.3.tar.gz 解压完毕后开始安装,如下: cd redis-3.2.3/ make&&make install 然后再切换到utils目录下&…

【LeetCode每日一题:792.匹配子序列的单词数~~~时间超限的双指针+改进优化的存储元素位置的二分查找】

题目描述 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 。 字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符(可以是none),而不改变其余字符的相对顺序。 例如, “ace” 是 “abcde” 的…

进程的通信 - 剪切板

剪切板是系统维护管理的一块内存区域,本机的所有进程都可以访问。当一个进程复制数据时,先将数据放在该内存区,当另一个进程粘贴时,则是从该内存区块取出数据 剪切板操作: 其实在剪切板中也就那几个API在使用&#x…

CEF 桌面软件开发实战

作者介绍 刘晓伦liulun,资深桌面端开发工程师。目前在一家大型国有控股上市公司任职,主要负责桌面端产品的核心技术研发、重难点技术攻关,以及新技术的预研和技术储备工作,拥有十几年的软件开发经验,在 Electron 、 Qt…

湖南郴州知心世界岛主王瑞平将出新书《知心世界》谷传民为其顾问

最近几天,被谷传民起诉的大衣哥,终于又满血复活,他也通过网络给知心世界岛主王瑞平送去了祝福。 就在农民歌唱家大衣哥,给知心世界岛主王瑞平,送去真挚的祝福不久,著名导演谷传民那边也有了动作。 原来&…

AntDesignVue动态创建下拉菜单

最近项目需要,有需要动态创建下拉菜单的需求,特此记录一下。 vue版本:3.1.4 ant-design-vue版本:2.1.6 需求是下拉菜单项可以根据配置来控制是否显示,那么就需要用到 v-for 和 v-if 的结合。 v-for 和 v-if 是不能…

MOSFET N-CH 30V SM3323NHQAC-TRG、SI7114DN-T1-GE3场效应管

型号:SM3323NHQAC-TRG SM3323NHQAC 描述:N沟道 30V 54A 封装:DFN3x3D-8 型号:SI7114DN-T1-GE3 SI7114DN 描述:MOSFET N-CH 30V 11.7A PPAK1212-8 FET 类型:N 通道 技术:MOSFET(金属…

【C++进阶】map和set——中篇(AVL树的学习)

🎇C笔试强训 博客主页:一起去看日落吗分享博主的C刷题日常,大家一起学习博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话:夜色难免微凉,前方必有曙光 🌞。 🍁 &…

第8章 数据库连接池

*数据库连接池的基本思想:为数据库建立一个缓冲池,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从缓冲池中取出一个,使用完毕后再放回 *数据库连接池负责分配、管理和释放数据库连接,…