今天我讲讲CUDA所用到的编译器nvcc:
nvcc编译器根据配置编译CUDA C代码,可以生成三种不同的输出:PTX、CUDA二进制序列和标准C。
nvcc可编译同时包含主机代码(在主机上执行的代码)和设备代码(在设备上执行的代码)的源文件。nvcc的基本流程包括分离主机和设备代码并将设备代码编译成汇编形式(PTX)或/和二进制形式(cubin对象)。生成的主机代码要么被输出为C代码供其它工具编译,要么在编译的最后阶段被nvcc调用主机编译器输出为目标代码。
应用在运行时装载的任何PTX代码被设备驱动进一步编译成二进制代码。这称为即时编译。
PTX类似于汇编语言,是为动态编译器JIT(即时编译)设计的输入指令序列。这样虽然不同的显卡使用的机器语言不同,JIT却可以运行同样的PTX。这样做使PTX成为一个稳定的接口,带来了很多好处:后向兼容性,更长的寿命,更好的可扩展性和更高的性能,但在一定程度上也限制了工程上的自由发挥。这种技术保证了兼容性,但也使新一代的产品必须拥有上代产品的所有能力,这样才能让今天的PTX代码在未来的系统仍然可以运行。 虽然PTX和JIT编译器提供了很高的性能,但也不是在所有场合都适用。某些独立的开发商倾向于牺牲性能,以获得更好的可确定性和可验证性。JIT编译器的输出会因为目标硬件和一些其他因素发生变化。
编译的大概流程如下图:
