首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >AII考试学习3 NVCC

AII考试学习3 NVCC

作者头像
用户12553134
发布2026-07-06 13:27:53
发布2026-07-06 13:27:53
60
举报

CUDA,英伟达的护城河,有着全世界最多的开发者使用,你遇到的问题大概率其他开发者也遇到过,很容易查到解决办法。其他友商的产品就差这个,也许算子都没有需要手搓。

1. nvcc 基础定位与编译原理

  • 核心作用:nvcc 是 CUDA 编译器驱动,封装了完整的 CUDA 编译流程,自动分离主机(host)代码与设备(device)代码。设备代码由 NVIDIA 专有编译器编译,主机代码转发给系统 C++ 主机编译器(gcc/clang/cl.exe 等),最终将设备二进制嵌入主机目标文件,链接时自动加入 CUDA 运行时库。
  • 两阶段编译模型
    • 阶段 1:将.cu 中的设备代码编译为虚拟架构的 PTX 中间汇编(对应compute_xy 虚拟架构)
    • 阶段 2:将 PTX 汇编为真实 GPU 架构的二进制 cubin(对应sm_xy 真实架构)
  • JIT 即时编译:若程序仅嵌入 PTX,运行时 CUDA 驱动会根据当前 GPU 架构实时编译为对应二进制,保障向前兼容,但会增加启动耗时。
  • Fatbinary 胖二进制:可同时嵌入多套 PTX 和多架构 cubin,兼顾兼容性与启动速度,是 CUDA 程序发布的标准形式。

2. 编译阶段与核心文件类型

输入后缀

说明

.cu

CUDA 源文件,同时包含主机代码与设备函数

.ptx

PTX 中间汇编文件

.cubin

单 GPU 架构的设备二进制文件

.fatbin

胖二进制,可包含多套 PTX 与 cubin

.o/.obj

主机目标文件,可嵌入设备胖二进制

高频编译阶段与对应选项:

编译目标

长选项

短选项

生成 PTX 汇编

--ptx

-ptx

生成 cubin 二进制

--cubin

-cubin

生成 fatbin 胖二进制

--fatbin

-fatbin

编译为主机目标文件

--compile

-c

生成可重定位设备代码(RDC)

--device-c

-dc

执行设备链接

--device-link

-dlink

3. 高频命令选项

(1)GPU 代码生成类
  • --gpu-architecture (-arch):指定虚拟编译架构(compute_xy),控制 PTX 支持的功能集;支持简写(直接写sm_xy 会自动匹配对应虚拟架构),也支持-arch=native(自动检测本机 GPU)、-arch=all(生成全架构代码)。
  • --gpu-code (-code):指定最终生成的真实 GPU 架构二进制,可指定多个;值必须与-arch 的虚拟架构兼容(真实架构版本不能低于虚拟架构)。
  • --generate-code (-gencode):更灵活的多架构编译选项,可指定多组「虚拟架构 + 真实架构」组合,是发布版程序的标准写法。
  • --relocatable-device-code (-rdc):开启 / 关闭可重定位设备代码,默认false(全程序编译模式,设备代码不能跨文件引用);设为true 后支持跨文件设备函数调用,但必须经过 nvlink 设备链接。
  • --maxrregcount:限制设备函数的最大寄存器使用量;寄存器越多单线程性能越好,但会降低可并发的线程块数量,是性能调优核心参数。
  • --use_fast_math:快速数学库,等价于开启ftz=trueprec-div=falseprec-sqrt=falsefmad=true,牺牲浮点精度换取计算性能。
(2)调试与优化类
  • --device-debug (-G):生成设备代码调试信息,会默认关闭所有设备代码优化,仅用于调试;性能分析应使用--generate-line-info (-lineinfo)
  • --debug (-g):仅生成主机代码调试信息,不影响设备代码优化。
  • --dlink-time-opt (-dlto):设备链接时优化(LTO),编译时存储高级中间码,链接时执行跨文件全局优化。
  • --default-stream:指定默认 CUDA 流,默认legacy(遗留流,隐式同步),可选per-thread(线程私有流,无隐式同步)。
(3)工具透传与路径类
  • 透传选项:-Xcompiler(传给主机编译器)、-Xlinker(传给主机链接器)、-Xptxas(传给 PTX 汇编器)、-Xnvlink(传给设备链接器)
  • 路径工具:-ccbin 指定主机编译器路径;--cudart 指定 CUDA 运行时库类型(默认static 静态库);-I/-L/-l 分别指定头文件路径、库路径、链接库名,与 gcc 用法一致。

4. 分离编译与设备链接

  • 默认全程序模式(rdc=false):单个.cu 的设备代码自成完整程序,不能跨文件调用设备函数,无需设备链接。
  • 分离编译模式(rdc=true):支持跨文件设备函数调用、动态并行等特性,编译生成可重定位设备代码,最终必须通过-dlink 执行设备链接(nvlink)生成可执行设备代码,再交给主机链接器。

5. 内置宏与环境变量

  • 核心内置宏
    • __NVCC__:编译所有 C/C++/CUDA 文件时定义
    • __CUDACC__:仅编译 CUDA 源文件时定义
    • __CUDACC_RDC__:开启 RDC 分离编译模式时定义
    • __CUDACC_DEBUG__:开启设备调试模式时定义
  • 环境变量
    • NVCC_PREPEND_FLAGS /NVCC_APPEND_FLAGS:全局前置 / 追加 nvcc 选项,无需修改构建脚本
    • NVCC_CCBIN:全局指定默认主机编译器

了解一下CUDA编译的过程,这个应该不会是AII考试的重点,不过对于日常运维还是有一些用处。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算力网络探索 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CUDA,英伟达的护城河,有着全世界最多的开发者使用,你遇到的问题大概率其他开发者也遇到过,很容易查到解决办法。其他友商的产品就差这个,也许算子都没有需要手搓。
  • 1. nvcc 基础定位与编译原理
  • 2. 编译阶段与核心文件类型
  • 3. 高频命令选项
    • (1)GPU 代码生成类
    • (2)调试与优化类
    • (3)工具透传与路径类
  • 4. 分离编译与设备链接
  • 5. 内置宏与环境变量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档