Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nvcc简介

nvcc简介

作者头像
狼啸风云
修改于 2022-09-02 14:31:38
修改于 2022-09-02 14:31:38
2.9K0
举报

nvcc编译分成device部分编译和host部分编译,host部分直接调用平台编译器进行编译Linux使用gcc,window使用cl.exe,这里主要讲解device部分的编译,此部分编译分两个阶段,第一阶段将源文件.cu文件的device部分编译成ptx文本指令,第二阶段将ptx文本指令编译成在真实架构上运行的二进制指令,第二阶段可能发生在生成可执行程序的过程中,也可能发生在运行可执行程序的过程中(just-in-time compilation)。在生成可执行程序的过程中可以根据nvcc选项选择是否将ptx文本指令(x.ptx中间文件中)、二进制指令(x.cubin中间文件)嵌入到可执行程序中,一般有3种嵌入方式:只嵌入x.ptx(第二阶段被忽略,全部依赖just-in-time compilation);只嵌入x.cubin(无法进行just-in-time compilation);两者都嵌入(运行过程中driver找到合适二进制指令镜像则加载之,否则进行just-in-time compilation再加载之)。

虚拟架构和真实架构

gpu设备的应用兼容性和cpu明显不同,cpu每一代指令集一般都兼容上一代指令集,所以已发布的应用可以运行在新一代的cpu硬件上,但GPU新一代指令集不兼容上一代的指令集。GPU使用virtual architectures来保证应用层兼容性(PTX可以看做虚拟的GPU架构,ptx是文本指令)。GPU虽然在真实架构上不具备二进制指令的兼容性,但是PTX可以跨代兼容,例如使用compute_30虚拟架构生成的PTX指令,可以用来生成sm_50的真实架构的二进制指令。低代PTX文本指令可以跨代生成高代二进制指令,但低代二进制指令却无法跨代运行在高代真实架构GPU,高代二进制指令更不可能运行在低代架构GPU上。

sm_30 and sm_32

Basic features + Kepler support + Unified memory programming

sm_35

Dynamic parallelism support

sm_50, sm_52, and sm_53

Maxwell support

sm_60, sm_61, and sm_62

Pascal support

sm_70

Volta support

上表中第二列Kepler、 Maxwell、 Pascla 、Volta都是NVDIA显卡架构名(不同于系列名,如GeForce、 Quadro是系列名,分别对应游戏和深度学习两个领域),各代架构对应不同的各代指令集。第一列对应显卡的functional capabilities,例如sm_35,3代表第3代架构,5代表第五发版本,同一代的二进制指令是兼容的,sm_30的真实架构的二进制指令可以运行在sm_35架构的GPU上。

Virtual Architecture Feature List

compute_30 and compute_32

Basic features + Kepler support + Unified memory programming

compute_35

Dynamic parallelism support

compute_50, compute_52, and compute_53

Maxwell support

compute_60, compute_61, and compute_62

Pascal support

compute_70

Volta support

上表对应GPU虚拟架构,类比真实架构进行理解。

NVCC使用

使用指令

代码语言:txt
AI代码解释
复制
nvcc x.cu --gpu-architecture=compute_50 --gpu-code=sm_50

效果如下图

最终只有对应真实架构sm_50的二进制的指令被嵌入到最用的可执行程序或者库文件中,如果运行在非sm_50的GPU上,将会报错如下:

代码语言:txt
AI代码解释
复制
addKernel launch failed: no kernel image is available for execution on the device

addWithCuda failed!

因为没有将PTX文本指令嵌入到可执行程序中,没法进行即时编译(just-in-time compilation)。

将PTX文本指令和二进制指令都嵌入到可执行程序中可以使用指令:

代码语言:txt
AI代码解释
复制
nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50,sm_50

或者省略--gpu-code

代码语言:txt
AI代码解释
复制
nvcc x.cu --gpu-architecture=sm_50

将一个版本的PTX指令和多种二进制指令嵌入可执行程序使用如下指令:

代码语言:txt
AI代码解释
复制
nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50,sm_50,sm_52

只将ptx文本指令嵌入到可执行文件可以使用如下指令:

代码语言:txt
AI代码解释
复制
nvcc x.cu --gpu-architecture=compute_50 --gpu-code=compute_50

或者省略--gpu-code

代码语言:txt
AI代码解释
复制
nvcc x.cu --gpu-architecture=compute_50

just-in-time compilation如下:

总结:compute_50这参数项用来指定生成ptx指令的版本,跟在--gpu-architecture选项和--gpu-code选项之后皆可;sm_50这类参数用来指定生成二进制代码的版本,不考虑shorthand的情况(详见官网,就是以上省略--gpu-code的情况),跟在--gpu-code选项之后;--gpu-architecture选项只能跟一个参数,不考虑shorthand的情况,只能用来指定生成的ptx版本;--gpu-code选项可以跟多个参数,不考虑shorthand的情况,用来指定生成的二进制文件的版本和最终嵌入到可执行文件中的内容,是只有ptx文本指令还是只有二进制指令,或者两者皆有。为何不混淆记忆,我们可以不使用shorthand的情况,即不省略--gpu-code选项。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
DAY3:阅读CUDA C编程接口
我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第三天,我们将用三天时间来学习CUDA 的编程接口。希望在接下来的97天里,您可以学习到原汁原味的CUDA,同时能养成英文阅读的习惯。 本文共计1533字,阅读时间30分钟 3. Programming Interface CUDA C provides a simple path for users familiar with the C programming language to easily write
GPUS Lady
2018/06/25
1.1K0
xmake v2.2.7 发布, 改进Cuda项目构建
这个版本主要对Cuda项目的构建做了很多的改进,并且新增了对lex/yacc编译支持,同时也对target新增了on_link, before_link和after_link等链接阶段的定制化支持。
ruki
2019/08/13
6590
CUDA 编程相关;tensorflow GPU 编程;关键知识点记录;CUDA 编译过程;NVCC
本文章主要是记录,cuda 编程过程中遇到的相关概念,名字解释和问题;主要是是用来备忘:
西湖醋鱼
2020/12/30
8650
CUDA 编程相关;tensorflow GPU 编程;关键知识点记录;CUDA 编译过程;NVCC
如何编写PTX 代码
通过以上步骤,您可以方便地获得或编写 PTX 代码。PTX 是 CUDA 编程中的重要组成部分,掌握它有助于您深入了解 GPU 并行计算的底层机制
jack.yang
2025/04/05
1150
解决问题使用nvcc fatal : Unsupported gpu architecture 'compute_75'
在使用 NVCC 编译 CUDA 代码时,有时候会遇到错误信息 nvcc fatal: Unsupported gpu architecture 'compute_75'。这个错误通常表示当前的 GPU 架构不受支持,需要采取一些步骤来解决这个问题。
大盘鸡拌面
2023/11/29
1.5K0
英伟达CUDA指令集架构(ISA)介绍
英伟达CUDA指令集架构(ISA)是CUDA技术的核心部分,它定义了GPU如何理解和执行程序中的指令。尽管详细的ISA细节通常对普通开发者来说是透明的,因为大多数开发者通过高级语言(如C/C++)编写CUDA代码,了解其基本原理有助于深入理解CUDA的工作方式和优化代码。
用户7353950
2024/07/05
9180
英伟达CUDA指令集架构(ISA)介绍
使用cuda-gdb调试cu程序
本文介绍了如何使用cuda-gdb调试cu程序,包括编译、关闭X、使用cuda-gdb、设置断点、查看变量和寄存器、运行和调试、获取帮助等。
用户1148523
2018/01/09
3.1K0
显卡,显卡驱动,nvcc, cuda driver,cudatoolkit,cudnn区别?
在使用深度学习框架的过程中一定会经常碰到这些东西,虽然anaconda有时会帮助我们自动地解决这些设置,但是有些特殊的库却还是需要我们手动配置环境,但是我对标题上的这些名词其实并不十分清楚,所以老是被网上的教程绕得云里雾里,所以觉得有必要写下一篇文章当做笔记供之后参考。
marsggbo
2019/11/11
14.6K0
PTX的定位与历史演进
数据革命下的算力饥渴 2012年AlexNet在ImageNet竞赛中引发的深度学习爆发,标志着GPU从图形处理器向通用计算加速器的根本性转变。根据NVIDIA财报数据,其数据中心业务收入从2016年的8.3亿美元飙升至2023年的150亿美元,年复合增长率达62%。这种指数级增长背后,是CUDA生态与PTX指令集构建的软件护城河。
jack.yang
2025/04/05
1140
PTX的定位与历史演进
CUDA编译器nvcc的用法用例与问题简答
本文使用nvcc版本:Cuda compilation tools, release 5.5, V5.5.0
恋喵大鲤鱼
2018/08/03
3.4K0
NVIDIA Blackwell RTX GPU与CUDA 12.8框架更新指南
随着NVIDIA Blackwell RTX GPU的发布,为了确保应用程序与这些新一代GPU的兼容性和最佳性能,应用开发者必须更新到最新的AI框架。NVIDIA专门发布了一个指南,详细介绍与NVIDIA Blackwell RTX GPU兼容所需的核心软件库更新,特别是CUDA 12.8的相关信息。
GPUS Lady
2025/02/04
1.6K0
NVIDIA Blackwell RTX GPU与CUDA 12.8框架更新指南
手动编译Parboil
这里是使用Parboil自带的脚本编译和使用的教程:https://blog.csdn.net/FishSeeker/article/details/79479714
用户1148523
2019/05/26
7380
xmake从入门到精通7:开发和构建Cuda程序
xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验。
ruki
2019/12/03
7000
Ubuntu22安装N卡驱动以及CUDA
官网网址:https://www.nvidia.com/Download/index.aspx?lang=en-us
Here_SDUT
2024/02/03
3.8K0
Ubuntu22安装N卡驱动以及CUDA
【编程基础】C语言从源程序到可执行程序
一.0,1、文本信息和字符编码 所有的信息在计算机中都是以0、1及其组合形式存在。文本信息也不例外。文本信息是以人类容易理解的方式来呈现信息。 计算机是在美国诞生的,英文26个字母加上其他符号只有128个,只用7个bit便可以完全表示所有符号。用8个bit,及一个byte来表示一个符号的方式就叫做ascii编码。对应的有ascii码表。 比如说要在计算机中表示"i love you"这个信息,采用ascii编码方式,那么在计算机中,那就是69 20 6c 6f 76 65 20 79 6f
程序员互动联盟
2018/03/13
1.3K0
PTX与汇编语言
总之,尽管汇编语言和PTX都属于低级编程语言,但它们在指令架构、并行编程支持、指令集与优化方式以及可移植性与灵活性方面存在显著差异。汇编语言更倾向于传统的单线程或多任务环境中的硬件控制,而PTX则专为GPU的并行计算架构设计,能够高效地管理大量线程并充分利用GPU的并行计算能力。这两种语言适用于不同的使用场景,在各自的领域发挥着重要作用。
jack.yang
2025/04/05
770
windows 11 搭建 TensorFlow GPU 开发环境【RTX 3060】:2 -- 基于WSL2 docker 方式的使用
目前我看官网主要推荐docker 方式了,那我们就用docker 方式试试。而且网上的安装教程也是docker 的居多【官方给出了一个教程】,我们也要与时俱进。
流川疯
2021/12/08
3.4K0
windows 11 搭建 TensorFlow GPU 开发环境【RTX 3060】:2 -- 基于WSL2 docker 方式的使用
DAY58:阅读Launch Bounds
As discussed in detail in Multiprocessor Level, the fewer registers a kernel uses, the more threads and thread blocks are likely to reside on a multiprocessor, which can improve performance.
GPUS Lady
2018/08/01
1.3K0
DAY58:阅读Launch Bounds
Mac下Caffe安装
下载地址:https://developer.nvidia.com/cuda-toolkit-archive,本文采用的是CUDA 7.5版本。下载安装之后,需要配置环境变量,编辑/etc/profile',添加PATH=$PATH:/Developer/NVIDIA/CUDA-7.5/bin`。
Tyan
2019/05/25
1.6K0
什么是cuDNN?如何安装CUDA和cuDNN
文章原文指路:https://juejin.cn/post/7479993915041660968
CloudStudio
2025/03/13
3630
相关推荐
DAY3:阅读CUDA C编程接口
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档