NVIDIA CUDA Toolkit 12.4 加强运行时 Fatbin 的创建 - Blockchain.News

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

realtime news Jun 19, 2024 05:17

NVIDIA CUDA Toolkit 12.4 引入了 nvFatbin 库,简化了运行时 fatbin 的创建并增强了 GPU 代码的兼容性。

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

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 的开发者的一个重要工具。

Image source: Shutterstock