解读CUDA Compiler Driver NVCC - Ch.5

2023-11-17

前言


前面几篇文章,我们了解了NVCC的作用,nvcc编译的two stage, 每个stage做了什么,怎么去选择虚拟架构和真实架构,JIT编译的原理,好处和弊端以及解决方案。本文我们将了解几个实际的nvcc编译命令。

Base Notation


nvcc提供了选项--gpu-architecture和--gpu-code。

--gpu-architecture只能选择一个值,用来指定虚拟架构的名称,如下:

--gpu-architeture=compute_50

--gpu-code可以选择一系列的真实GPU架构,如下:

--gpu-code=sm_50,sm_52

nvcc命令

nvcc x.cu --gpu-architecture=compute_50 --gpu-code=sm_50,sm_52

Shorthand


nvcc提供了一些缩写来简化命令。

Shorthand1

--gpu-code 参数可以是虚拟架构。在这种情况下,这种虚拟架构将省略第 2 阶段转换,而是嵌入第 1 阶段 PTX 结果 (即x.ptx文件)。在应用程序启动时,如果驱动程序没有找到更好的替代方案,驱动程序将使用 PTX 作为输入调用第 2 阶段编译。

nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50,sm_50,sm_52

Shorthand2

--gpu-code可以被省略。只有在这种情况下,--gpu-architecture可以接收真实架构的值。--gpu-code 值默认为由 --gpu-architecture 指定的 GPU 实现的最接近的虚拟架构,加上 --gpu-architecture 值本身。

nvcc x.cu --gpu-architecture=sm_52

等效于

nvcc x.cu --gpu-architecture=compute_52 --gpu-code=sm_52,compute_52

最接近的虚拟架构被用作 --gpu-architecture值。 如果 --gpu-architecture 值是虚拟架构,它也用作有效的 --gpu-code 值。又如

nvcc x.cu --gpu-architecture=compute_50

等效于

nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50

Shorthand3

--gpu-architecture 和--gpu-code都可被省略。

nvcc x.cu

等效于

nvcc x.cu --gpu-architecture=compute_52 --gpu-code=sm_52,compute_52

Extended Notation


选项 --gpu-architecture 和 --gpu-code 可用于使用通用虚拟架构(common virtual architecture)为一个或多个 GPU 生成代码的所有情况。这将导致 nvcc 阶段 1(即虚拟 PTX 汇编代码的预处理和生成)的单个调用,然后是编译阶段 2(二进制代码生成,即x.cubin),编译阶段2会为每个特定GPU重复编译.

使用一个通用虚拟架构,意味着,对于整个 nvcc 编译,所有假定的 GPU 功能都是固定的。

比如说,以下 nvcc 命令假定 sm_50 代码和 sm_53 代码均不支持半精度浮点运算:

nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50,sm_50,sm_53

有时需要为划分到不同的架构时执行不同的 GPU 代码生成步骤。这个时候就需要使用--generate-code,而不是使用--gpu-architecture和--gpu-code的组合。

与--gpu-architecture不同,--generate-code可能被nvcc命令重复执行。--generate-code需要子选项arch和code. 如果使用重复架构编译,那么设备代码必须使用基于架构识别宏( architecture identification macro )__CUDA_ARCH__的值的条件编译.

比如说,以下假设不支持 sm_50 和 sm_52 代码的半精度浮点运算,但完全支持 sm_53:

nvcc x.cu \--generate-code arch=compute_50,code=sm_50 \--generate-code arch=compute_50,code=sm_52 \--generate-code arch=compute_53,code=sm_53

或者,将实际的 GPU 代码生成留给 CUDA 驱动程序中的 JIT 编译器:

nvcc x.cu \--generate-code arch=compute_50,code=compute_50 \--generate-code arch=compute_53,code=compute_53

代码子选项可以与稍微复杂的语法结合使用:​​​​​​​

nvcc x.cu \--generate-code arch=compute_50,code=[sm_50,sm_52] \--generate-code arch=compute_53,code=sm_53

Virtual Architecture Identification Macro


在为compute_xy 编译的每个nvcc 编译阶段1 期间,体系结构标识宏__CUDA_ARCH__ 被分配一个三位数的值字符串xy0(以0 结尾)。

该宏可用于 GPU 函数的实现,以确定当前正在编译的虚拟架构。主机代码(非 GPU 代码)不能依赖它。

总结


至此,我们已经了解了nvcc命令的原理和基本使用。本文剩下两个章节分别是Using Separate Compilation in CUDA和Miscellaneous NVCC Usage。这两章节涉及了更多其他NVCC应用的内容,但我打算将来真正涉及到相关使用的时候再来介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解读CUDA Compiler Driver NVCC - Ch.5 的相关文章

随机推荐

  • 【大数据技术】Spark MLlib机器学习特征抽取 TF-IDF统计词频实战(附源码和数据集)

    需要源码和数据集请点赞关注收藏后评论区留言私信 特征抽取 TF IDF TF IDF是两个统计量的乘积 即词频 Term Frequency TF 和逆向文档频率 Inverse Document Frequency IDF 它们各自有不同
  • QT笔记- 对QSring字符串内容进行过滤筛选或对QLineEdi的可输入内容进行控制,使其不含某些字符、只含某些字符或只含特定格式的字符串,如只含字母数字和下划线

    QSring字符串内容的过滤筛选 QString类函数contains 用于判断字符串中是否含有某些字符 其有两个重载函数 第一个是简单筛选 第二个是使用 正则表达式 之后有解释 进行筛选 两函数原型为 bool QString conta
  • protocol buffer 编解码

    平时的开发中使用pb格式协议较多 大致了解了一下pb的编解码 即序列化和反序列化 本文参考官方文档 https developers google com protocol buffers docs encoding hl zh cn 先看
  • Word去除多余的页眉

    word去除多余的页眉 1 在正式页眉开始的页面点击鼠标 此时光标位于要删除页眉下划线页的首部 2 单击上方菜单栏的 页面布局 分隔符 分节符 下一页 3 在正式页眉开始的地方双击鼠标 进入 页眉编辑 状态 4 单击 页眉和页脚 将 链接到
  • SVN时代...

    SourceForge开始全面支持Subversion 这真是个好消息 这预示着CVS独霸天下的时代快要结束 SVN时代就要来临 和CVS比起来 SVN的确很强大 这就像它的出现就是为了取代CVS一样 它的目标快要实现了 具体的功能特性大家
  • Cocos2d-x 3.17.1 Android Studio环境搭建和创建编译项目和真机调试

    eclipse NDK参考 https www cnblogs com l d d p 6531557 html 最近项目上需要用Cocos2d x在Android智能硬件上进行开发 很早之前搭建过Cocos2d x3 15 1 Eclip
  • 利用IDM实现百度云满速下载

    一 IDM Internet Download Manager 简称 IDM 是一种将下载速度提高5倍的工具 可以恢复和安排下载 由于连接丢失 网络问题 计算机关机或意外停电等原因 全面的错误恢复和恢复功能将重新启动中断或中断的下载 简单的
  • MATLAB绘制正弦函数与余弦函数的线性组合曲线

    h0 figure toolbar none position 200 150 450 350 name 实例11 x 0 pi 20 2 pi y1 sin x y2 cos x h1 stem x y1 y2 画出线性组合的图 hold
  • SQL注入——学生选课系统注入

    目录 前言 一 实验环境 二 实验步骤 1 万能密码 2 堆叠注入 3 报错注入 4 时间盲注 前言 本次实验利用教师指定的学生选课管理系统进行SQL注入 包含万能密码登录 堆叠注入 报错注入和时间盲注 一 实验环境 Windows10虚拟
  • QT 15--获取任何种类文件的某些文件属性:大小、创建时间、上次修改时间等等

    1 首先说一些 如果是mainwindow的QT工程 如果打算做自己手写ui 界面的话 该如何将自己写的内容添加到mainwindow界面呢 方法为 新建一个widget类 然后将所有零件都用布局布置好后 只需将总布局添加到widet 然后
  • KMP时间复杂度分析

    比较过程分析 比较次数 比较次数 红色 蓝色 蓝色部分是相比暴力求解 节省下的比较次数 周期 从比较次数可以看出 呈现 1 1 1 1 5 这样的周期 一个周期内的比较次数 8 周期长度 5 周期个数 n 5 比较总次数 周期个数 一个周期
  • 学成在线笔记+踩坑(10)——课程搜索、课程发布时同步索引库。

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 牛客面试题 java黑马笔记 目录 1 检索模块 需求分析 1 1 全文检索介绍
  • H3 GPIO笔记

    NanoPi NEO Core最近买了一块 这个板子使用全志H3 查看H3的数据手册 把GPIO这部分做个笔记 H3有7组GPIO 如下 分别是PA PC PD PE PF PG PL 没有PB这一组 PA有22个端口 PC有19个端口 P
  • 【LeetCode题解】1475、商品折扣后的最终价格

    题目 给你一个数组 prices 其中 prices i 是商店里第 i 件商品的价格 商店里正在进行促销活动 如果你要买第 i 件商品 那么你可以得到与 prices j 相等的折扣 其中 j 是满足 j gt i 且 prices j
  • CSS动画:Transition与Animation

    本文总结CSS3中两个用来做动画的属性 一个是transition 另一个是animation 差异比较 CSS3 差异 transition 在给定的持续时间内平滑地更改属性值 从一个值到另一个值 也就是只需要指定开始与结束的参数 参数改
  • 让汽车的全景环视更智能更安全!

    随着现代汽车安全技术的进步 我们看到诸如全景环视等先进驾驶辅助 ADAS 技术成为现代汽车的新标准 本演示展示了如何通过精确的实时反射和AI来检测障碍 以提升全景环视系统的性能 让汽车驾驶更安全 尤其是 当全景环视系统内嵌Imaginati
  • cesium-添加点并且可以编辑

    完整代码
  • 05_Numpy任意行&列的删除方法(numpy.delete)

    05 Numpy任意行 列的删除方法 numpy delete 函数Numpy delete 可以删除ndarray数组中任意的行或者列 指定要删除的轴 维度 和要删除的位置 行号 列号 也可以通过切片或列表选择多个行或者列的编号 对以下的
  • 【Unity Shaders】抖音变身漫画1

    先来看一下手机拍出来的效果 我们发现有一张人像变成了卡通漫画脸 其它的只是做了一些图像处理 你可以再拍几张看一下 会发现千篇一律的大眼 小嘴有没有 你想的没错 这个是AI换脸技术 抖音特效里有很多了 把这个漫画脸再加上对图像的漫画处理 最后
  • 解读CUDA Compiler Driver NVCC - Ch.5

    前言 前面几篇文章 我们了解了NVCC的作用 nvcc编译的two stage 每个stage做了什么 怎么去选择虚拟架构和真实架构 JIT编译的原理 好处和弊端以及解决方案 本文我们将了解几个实际的nvcc编译命令 Base Notati