CUDA 从本质上来说,是向宿主机器提供了一个 GPU 的编程平台。因此,其 API 可以从两方面来进行观察:面向 CPU 宿主机器,以及面向 GPU 设备。
对于 CPU 宿主机器,CUDA 提供了 nvcuda.dll 这个驱动程序,它由 NVIDIA 驱动自行安装于 Windows 的系统目录之下,其中提过了很多类似cuXXXX()
的函数,NVIDIA 官方称之为 CUDA Driver API。另外,为了更加简化开发, NVIDIA 还随 CUDA Toolkit 发布了一个 C 语言库,提供一系列更加友好的形如cudaXXXX()
函数,它们包含在 CUDA Toolkit 目录下的 cudart.dll 库文件里,NVIDIA 官方称之为 CUDA Runtime API。
而对于 GPU 设备,CUDA 可以说是提供了一个编程平台,而这个平台上使用的语言则是 PTX 汇编语言。由于 PTX 是汇编语言,使用不方便,NVIDIA 同时提供了一套经过修改的 C 语言,称之为 CUDA C。这个高级语言使用 C 语法,并扩充了一些诸如__global__
,__device__
这样的关键字,使其能够通过 CUDA Toolkit 提供的编译器编译成 PTX 汇编语言。而 PTX 源程序又进一步通过 CUDA Toolkit 的汇编编译器编译成能够直接载入 GPU 设备的二进制语言。
可以看出,由于这个模式混杂了两个方面,所以编译过程是比较复杂的。NVIDIA 提供的 nvcc 编译器则掌管了整个编译过程,使其简化。实际上,nvcc 只是用来管理一个编译过程流,它通过调用其他专用工具