目录
1. 简介
1.1 概览
1.1.1 cuda编程模型
Cuda开发工具套件主要为那类控制部分运行在通用计算设备(CPU等)上进程的应用程序使用,使用单个或多个NVIDIA GPU作为协处理器应用进程提供加速,主要加速SPMD(单程序多数据流)的并行任务。
GPU代码被实现为C++语言的函数集合,但与主机(CPU)代码不同的是包含了一些特定的注解 ,还包含一些用于区分GPU上不同类型数据内存的注解。
1.1.2 cuda源文件
cuda程序源文件包含C++的主机侧代码和GPU设备函数。cuda编译时,会将设备端函数从主机代码中分离出来,使用NVIDIA编译器和汇编器来编译设备函数 ,而使用C++编译器来编译主机侧代码。之后,将GPU函数的编译结果作为fatbinary images(二进制映像)嵌入到主机侧编译的目标文件中 。在链接阶段,将特定的cuda运行时库添加进去,以此来支持远程SPMD程序的调用,并提供特定的GPU操作支持(例如:分配GPU的内存缓冲区,主机和GPU设备之间的数据传输)。
1.1.3 NVCC目标
编译过程主要有:
- 多次分离(splitting):将主机和设备代码分离
- 编译(compilation):分别调用不同的编译工具,编译主机和设备源代码
- 预处理(preprocessing):具体做了什么呢 ?
- 合并(merge):合并设备编译结果到主机编译的目标文件中
nvcc是cuda编译器的driver(驱动者),它隐藏了复杂的cuda编译细节。支持很多传统编译器(GNU)的编译选择,例如:定义宏,指定头文件/库的搜索路径,引导编译过程等。所有的非cuda相关的编译步骤都被转发给nvcc支持的C++编译器(例:GNU GCC),nvcc将编译选项翻译成合适的主机编译器编译选项。
1.2 支持的主机侧编译器
nvcc在以下两个情形,需要通用主机侧C++编译器的支持:
- 非cuda阶段:被转发给相关的主机侧编译器
- Cuda 阶段:主要进行几个预处理阶段,以及主机侧代码的编译
nvcc假设主机编译器进行了标准安装(安装路径等),如果是非标准安装,用户需要设置正确的相关环境变量,并提供必要的nvcc编译选项。
在Linux平台上,nvcc默认使用gcc和g++作为主机侧编译器,在Mac OS平台上,默认使用clang和clang++作为主机侧编译器,在Windows平台上,默认使用cl.exe作为编译器。
关于作者:
犇叔,浙江大学计算机科学与技术专业,研究生毕业,而立有余。先后在华为、阿里巴巴和字节跳动,从事技术研发工作,资深研发专家。主要研究领域包括虚拟化、分布式技术和存储系统(包括CPU与计算、GPU异构计算、分布式块存储、分布式数据库等领域)、高性能RDMA网络协议和数据中心应用、Linux内核等方向。
专业方向爱好:数学、科学技术应用
关注犇叔,期望为您带来更多科研领域的知识和产业应用。
内容坚持原创,坚持干货有料。坚持长期创作,关注犇叔不迷路