基本工具
-
NVCC(NVIDIA CUDA Compiler):
nvcc
是 NVIDIA 提供的 CUDA 编译器,用于将 CUDA 源代码(.cu 文件)编译成可执行文件或库。它可以处理 CUDA 和主机代码(例如 C++)的混合编译。nvcc
调用底层的主机编译器(如gcc
或clang
)来编译非 CUDA 代码部分。
-
CUDA Toolkit:
- 包含 CUDA 编译器、库、开发工具和示例代码。
- 常见路径:
/usr/local/cuda
。
编译步骤
-
编写 CUDA 源代码:
- CUDA 程序通常由主机代码(运行在 CPU 上)和设备代码(运行在 GPU 上)组成。
- 设备代码使用
__global__
、__device__
或__host__
关键字定义内核函数。
-
编译 CUDA 源文件:
-
使用
nvcc
编译 .cu 文件:bashnvcc -o my_program my_program.cu
-
nvcc
编译 .cu 文件时,会先将主机代码部分提取并交给主机编译器(如gcc
)处理,然后将设备代码部分编译成 PTX 或 SASS 代码。
-
-
指定架构:
-
使用
-arch
选项指定目标 GPU 的架构:bashnvcc -arch=sm_52 -o my_program my_program.cu
-
-
优化和调试选项:
-O3
:优化级别 3。-G
:生成调试信息。-lineinfo
:生成行号信息。
-
链接库:
-
编译时需要链接 CUDA 运行时库和其他依赖库:
-I
选项-I
选项用于指定头文件的搜索路径。编译器在编译源文件时需要找到所有引用的头文件,如果这些头文件不在默认的系统路径下,就需要用-I
选项来指定路径。示例:
shnvcc -I/usr/local/cuda/include my_cuda_program.cu
这条命令告诉
nvcc
去/usr/local/cuda/include
目录下查找头文件。-L
选项-L
选项用于指定库文件的搜索路径。编译器在链接阶段需要找到所有引用的库文件,如果这些库文件不在默认的系统路径下,就需要用-L
选项来指定路径。示例:
shnvcc -L/usr/local/cuda/lib64 my_cuda_program.cu -lcudart
这条命令告诉
nvcc
去/usr/local/cuda/lib64
目录下查找库文件。-l
选项-l
选项用于指定要链接的库文件。-l
选项后面跟的是库的名称,而不是库文件的全名。编译器会在指定的路径中查找名为lib<name>.so
或lib<name>.a
的文件。示例:
shnvcc -L/usr/local/cuda/lib64 my_cuda_program.cu -lcudart
这条命令告诉
nvcc
链接名为libcudart.so
或libcudart.a
的库。综合使用上述选项的一个示例如下:
shnvcc -I/usr/local/cuda/include -L/usr/local/cuda/lib64 -lcudart my_cuda_program.cu -o my_cuda_program
-
深入理解编译过程
预处理(Preprocessing)
在编译的预处理阶段,编译器会处理所有的 #include
指令,把头文件的内容插入到相应位置。这就是为什么需要用 -I
选项来指定头文件路径的原因。
编译(Compilation)
在编译阶段,编译器会把 CUDA 源文件翻译成中间表示(如 PTX 代码)。这一步的输出是目标文件(.o
文件)。
汇编(Assembly)
汇编阶段会把中间表示翻译成机器代码。这一步生成的是 GPU 可以理解的二进制代码。
链接(Linking)
链接阶段会把所有的目标文件和库文件结合起来生成最终的可执行文件。使用 -L
和 -l
选项来指定库文件的位置和名称。