NVIDIA CUDA Toolkit 12.4 向其 GPU 编程套件引入了一项重大改进,即添加了 nvFatbin 库。根据 NVIDIA 技术博客,这个新库允许在运行时创建 fatbin(多版本代码的容器),极大地简化了这些二进制文件的动态生成。
新库提供运行时 Fatbin 创建支持
Fatbin,或称 NVIDIA 设备代码 fat 二进制文件,对于存储不同架构(如 sm_61
和 sm_90
)的代码至关重要。以前,生成 fatbin 需要使用命令行工具 fatbinary
,这不利于动态代码生成。这个过程需要将生成的代码写入文件,通过 exec
调用 fatbinary
,并处理输出,过程繁琐且效率低下。
nvFatbin 库通过实现无文件操作及命令行解析的程序化 fatbin 创建,简化了这一过程。此项开发显著减少了动态生成 fatbin 的复杂性,使其成为开发 NVIDIA GPU 的开发者的一项宝贵工具。
如何实现运行时 Fatbin 创建
使用 nvFatbin 库在运行时创建 fatbin 需要几个步骤。首先,创建一个句柄来引用相关的设备代码片段:
nvFatbinCreate(&handle, numOptions, options);
接下来,使用特定于输入类型的函数(如 CUBIN、PTX 或 LTO-IR)将设备代码添加到 fatbin:
nvFatbinAddCubin(handle, data, size, arch, name); nvFatbinAddPTX(handle, data, size, arch, name, ptxOptions); nvFatbinAddLTOIR(handle, data, size, arch, name, ltoirOptions);
然后,在分配缓冲区以确保有足够空间后,获取生成的 fatbin:
nvFatbinSize(linker, &fatbinSize); void* fatbin = malloc(fatbinSize); nvFatbinGet(handle, fatbin);
最后,清理句柄:
nvFatbinDestroy(&handle);
使用 NVCC 进行离线 Fatbin 生成
对于离线 fatbin 生成,开发者可以使用 NVCC 编译器和 -fatbin
选项。这种方法允许创建包含多个不同架构条目的 fatbin,以确保在各种 GPU 模型上的兼容性。
兼容性和优点
nvFatbin 库保证与相同或更低主要版本的 CUDA 输入兼容。这意味着使用 CUDA Toolkit 12.4 的 nvFatbin 创建的 fatbin 将与 CUDA Toolkit 12.X 或更早版本生成的代码兼容,但不保证与 CUDA Toolkit 13.0 及以后的版本兼容。
这种兼容性确保开发者可以放心使用 nvFatbin 管理他们的 GPU 代码,而无需担心未来的不兼容性。此外,nvFatbin 库还支持以前版本的 CUDA 工具包输入,进一步增强了其实用性。
大局观
nvFatbin 的引入完善了运行时编译器组件套件,包括 nvPTXCompiler、NVRTC 和 nvJitLink。这些工具无缝交互,使开发者能够动态编译、链接和生成 fatbin,确保不同 GPU 架构上的最佳性能和兼容性。
结论
CUDA Toolkit 12.4 中的 nvFatbin 库标志着 GPU 编程的一个重大进步,简化了在运行时创建灵活和兼容的 fatbin 的过程。这一改进不仅简化了开发过程,还确保代码在未来 GPU 架构上的优化和兼容,从而使其成为开发 NVIDIA GPU 的开发者的一个重要工具。
Image source: Shutterstock