NVIDIA CUDA Toolkit 12.4 加强运行时 Fatbin 的创建

realtime news  Jun 19, 2024 13:17  UTC 05:17

1 Min Read

NVIDIA CUDA Toolkit 12.4 向其 GPU 编程套件引入了一项重大改进,即添加了 nvFatbin 库。根据 NVIDIA 技术博客,这个新库允许在运行时创建 fatbin(多版本代码的容器),极大地简化了这些二进制文件的动态生成。

新库提供运行时 Fatbin 创建支持

Fatbin,或称 NVIDIA 设备代码 fat 二进制文件,对于存储不同架构(如 sm_61sm_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 的开发者的一个重要工具。



Read More