CUDA runtime特性 —— Lazy Loading

Lazy Loading

Lazy Loading延迟了从程序初始化到内核执行的CUDA模块和内核的加载。如果一个程序没有使用它所包含的每个内核,那么一些内核将被不必要地加载。这是非常常见的,特别是如果你包含任何库。大多数情况下,程序只使用它们所包含库中的少量内核。

由于Lazy Loading,程序能够仅加载实际需要使用的内核,在初始化过程中节省时间。这减少了GPU存储器和主机存储器上的内存开销。

Lazy Loading is enabled by setting the CUDA_MODULE_LOADING environment variable to LAZY

首先,CUDA Runtime在程序初始化期间将不再加载所有模块,除非这些模块包含managed variables。每个模块将在首次使用该模块的变量或内核时进行加载。这种优化只适用于CUDA Runtime用户,不影响CUDA Driver用户。此优化已经在CUDA 11.8中发布。

其次,加载模块(cuModuleLoad*() 函数族)不会立即加载内核,而是在调用 cuModuleGetFunction() 时延迟加载内核。这里有一些特殊情况,某些内核必须在 cuModuleLoad*() 中加载,例如那些指针存储在全局变量中的内核。这种优化对 CUDA Runtime 和 CUDA Driver 用户都适用。CUDA Runtime 只有在首次使用/引用内核时才会调用 cuModuleGetFunction()。此优化已经包含在 CUDA 11.7 中。

这两个优化设计为对用户透明,前提是遵循 CUDA 编程模型。

参考