1. NVCC
1.1 nvcc
是什么?
nvcc
(NVIDIA CUDA Compiler)是 NVIDIA CUDA 编程工具链中的编译器驱动程序。它负责将基于 CUDA C/C++ 编写的代码编译成能够在 NVIDIA GPU 上执行的程序。
nvcc
会将 CUDA 内核代码 和普通 C/C++ 代码 编译在一起,生成最终的可执行文件或对象文件,供 CPU 和 GPU 协同运行。
1.2 nvcc
的主要功能
-
编译 CUDA 程序:
nvcc
处理标识为 GPU 的代码段(通常是__global__
或__device__
修饰的函数),并将这些代码编译成 GPU 能够理解的 PTX(并行线程执行)代码或二进制代码(SASS)。 -
支持混合代码:
它可以将 CPU 代码 和 GPU 代码 混合编译,从而实现 CPU 和 GPU 的协同计算。 -
生成目标代码:
- PTX(Parallel Thread Execution):GPU 中间表示代码。
- CUBIN(CUDA Binary):可直接在 GPU 上运行的二进制代码。
- 主机代码:用于 CPU 执行的部分。
-
跨平台支持:
支持多个操作系统,包括 Linux、Windows 和 macOS。
1.3 nvcc
的基本用法
打开x64 Native Tools Command Prompt for VS 2019
1. 编译 CUDA 程序
假设有一个名为 example.cu
的 CUDA 源文件,可以使用以下命令进行编译:
nvcc example.cu -o example
example.cu
:输入的 CUDA 源文件。-o example
:生成的可执行文件名称。
#include<stdio.h>
int main(int argc, char const *argv[])
{
printf("hello world!\n\n");
return 0;
}
nvcc helloworld.cu -o main
2. 生成 PTX 代码
要查看 CUDA 内核编译成的 PTX 代码,可以使用 -ptx
参数:
nvcc -ptx example.cu
- 输出文件为
example.ptx
。
3. 指定 GPU 架构
CUDA 支持不同的 GPU 架构(例如 sm_70、sm_80 等),你可以使用 -arch
参数指定 GPU 目标架构:
nvcc -arch=sm_70 example.cu -o example
sm_70
表示为 NVIDIA Volta 架构生成代码。- 不同的 GPU 架构标识可以在 NVIDIA 官方文档 中找到。
4060ti,这里采用sm_86
nvcc -arch=sm_86 helloworld.cu -o main
4. 查看 nvcc
版本
nvcc --v
- 输出结果会显示当前安装的 CUDA 编译器版本,例如:
Cuda compilation tools, release 11.8, V11.8.89 Build cuda_11.8.r11.8/compiler.31833905_0
nvcc
的工作流程
- 预处理:
nvcc
将源代码中的 CPU 和 GPU 代码区分开。 - 编译:
- CPU 部分:交给标准的 C/C++ 编译器 处理(如
gcc
或cl
)。 - GPU 部分:编译为 PTX 或 CUBIN,以便在 GPU 上执行。
- CPU 部分:交给标准的 C/C++ 编译器 处理(如
- 链接:将 CPU 和 GPU 代码重新组合,生成可执行文件。
nvcc
的典型输出文件
- 可执行文件(
.out
、.exe
) - PTX 文件(
.ptx
) - CUBIN 文件(
.cubin
) - 对象文件(
.o
或.obj
)
总结
nvcc
是 NVIDIA CUDA 工具链中的编译器驱动,用于编译 CUDA C/C++ 代码。- 它将 GPU 部分的代码转换为 PTX 或二进制代码,CPU 部分的代码交由标准 C/C++ 编译器处理。
- 使用
nvcc
可以轻松编译 CUDA 程序,实现 CPU 和 GPU 的协同计算。