CUDA 运行时可以将您的 CUDA 内核编译和链接到可执行文件中。这意味着您不必将 cubin 文件与您的应用程序一起分发,或者处理通过驱动程序 API 加载它们。正如您所指出的,它通常更易于使用。
相比之下,驱动程序 API 更难编程,但提供了对 CUDA 使用方式的更多控制。程序员必须直接处理初始化、模块加载等。
显然,通过驱动程序 API 可以查询到比运行时 API 更详细的设备信息。例如,设备上可用的空闲内存只能通过驱动程序 API 查询。
来自 CUDA 程序员指南:
它由两个 API 组成:
- 称为 CUDA 驱动程序 API 的低级 API,
- 在 CUDA 驱动程序 API 之上实现的称为 CUDA 运行时 API 的更高级别的 API。
这些 API 是互斥的:应用程序应该使用其中一个或另一个。
CUDA 运行时通过提供隐式初始化、上下文管理和模块管理来简化设备代码管理。nvcc 生成的 C 主机代码基于 CUDA 运行时(参见第 4.2.5 节),因此链接到此代码的应用程序必须使用 CUDA 运行时 API。
相比之下,CUDA 驱动程序 API 需要更多代码,更难编程和调试,但提供更好的控制级别并且与语言无关,因为它只处理 cubin 对象(参见第 4.2.5 节)。特别是,使用 CUDA 驱动程序 API 配置和启动内核更加困难,因为必须使用显式函数调用而不是第 4.2.3 节中描述的执行配置语法来指定执行配置和内核参数。此外,设备模拟(参见第 4.5.2.9 节)不适用于 CUDA 驱动程序 API。
API 之间没有明显的性能差异。你的内核如何使用内存以及它们在 GPU 上的布局方式(在扭曲和块中)将产生更明显的效果。