GSoC 2024:GPU Libc 基准测试
大家好!我叫 James,今年夏天通过 GSoC 在 LLVM 上工作。我的项目叫做 GPU Libc 基准测试。该项目的主要目标是为 GPU 上的 libc 开发微基准测试基础设施。
背景
LLVM libc 项目被设计为 glibc 的替代方案,旨在模块化、可配置且对 sanitizers 友好。目前,LLVM libc 正在移植到 Nvidia 和 AMD GPU 上,以在 GPU 上提供 libc 功能(例如 printf()、malloc() 和数学函数)。截至 2024 年 3 月,程序可以使用 GPU libc 在卸载语言(CUDA、OpenMP)中,或者通过直接编译和链接 libc 库来使用。
我们做了什么
在这个项目中,我们开发了一个微基准测试框架,该框架直接编译到 GPU 上并在 GPU 上运行,使用 libc 函数将输出显示给用户。由于这是一个短期项目(90 小时),我们主要集中在开发基础设施和编写一些示例用法(isalnum()、isalpha() 和 sin())上。
我们的基准测试基础设施基于 Google Benchmark,并测量每个基准测试的平均周期数、最小值、最大值和标准差。每个基准测试都运行多次以稳定结果。基准测试编写者可以通过向基准测试的 CMake 部分传递特定的链接标志,并从基准测试本身注册相应的供应商函数,来测量针对 libc 函数的供应商实现的性能。
以下是我们基准测试基础设施针对 sinf()
的输出示例:
Benchmark | Cycles | Min | Max | Iterations | Time / Iteration | Stddev | Threads |
----------------------------------------------------------------------------------------------------------
Sinf_1 | 764 | 369 | 2101 | 273 | 7 us | 323 | 32 |
Sinf_128 | 721 | 699 | 744 | 5 | 913 us | 16 | 32 |
Sinf_1024 | 661 | 650 | 689 | 9 | 7 ms | 31 | 32 |
Sinf_4096 | 666 | 663 | 669 | 5 | 28 ms | 28 | 32 |
SinfTwoPi_1 | 372 | 369 | 632 | 70 | 7 us | 39 | 32 |
SinfTwoPi_128 | 379 | 379 | 379 | 4 | 895 us | 0 | 32 |
SinfTwoPi_1024 | 335 | 335 | 338 | 5 | 7 ms | 20 | 32 |
SinfTwoPi_4096 | 335 | 335 | 335 | 4 | 28 ms | 0 | 32 |
SinfTwoPow30_1 | 371 | 369 | 510 | 70 | 7 us | 17 | 32 |
SinfTwoPow30_128 | 379 | 379 | 379 | 4 | 894 us | 0 | 32 |
SinfTwoPow30_1024 | 335 | 335 | 338 | 5 | 7 ms | 20 | 32 |
SinfTwoPow30_4096 | 335 | 335 | 335 | 4 | 28 ms | 0 | 32 |
SinfVeryLarge_1 | 477 | 369 | 632 | 70 | 7 us | 58 | 32 |
SinfVeryLarge_128 | 487 | 480 | 493 | 5 | 900 us | 14 | 32 |
SinfVeryLarge_1024 | 442 | 440 | 447 | 5 | 7 ms | 18 | 32 |
SinfVeryLarge_4096 | 441 | 441 | 442 | 4 | 28 ms | 14 | 32 |
用户可以使用宏类似于 Google Benchmark 注册基准测试:
uint64_t BM_IsAlnumCapital() {
char x = 'A';
return LIBC_NAMESPACE::latency(LIBC_NAMESPACE::isalnum, x);
}
BENCHMARK(LlvmLibcIsAlNumGpuBenchmark, IsAlnumCapital, BM_IsAlnumCapital);
结果
该项目实现了其主要目标,即为 GPU 创建微基准测试基础设施。然而,该提案的最初范围包括一个 CPU 部分,该部分将使用供应商工具来衡量 GPU 内核属性。然而,由于在将特定内核卸载到 GPU 时遇到的技术障碍(这将需要对代码的其他部分进行重大更改),该部分在与导师讨论后被删除了。
未来工作
由于这是一个短期项目(90 小时),我们只专注于实现微基准测试基础设施。未来的贡献者可以使用基准测试基础设施来添加更多基准测试。此外,还可以添加对微基准测试基础设施的改进,例如更多用户输入范围选项、更好的数学函数随机分布以及可以启动多个内核并将结果与 CPU 上运行的函数进行比较的 CPU 元素。
现有代码可以在 LLVM 仓库 中找到。
致谢
没有我优秀的导师 Joseph Huber、LLVM 基金会管理员和 GSoC 管理员,这个项目是不可能完成的。