LLVM 项目博客

LLVM 项目新闻和来自实战的详细信息

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 管理员,这个项目是不可能完成的。

链接

已合并的 PR

LLVM GitHub

LLVM 主页

GSoC 项目页面