常见问题

为什么 llvmlite 不总是支持 LLVM 的最新版本?

原因有以下几点

  1. 最重要的是,如果 llvmlite 声明支持某个特定版本的 LLVM,这意味着开发团队已验证该特定 LLVM 版本适用于 llvmlite 的用途,主要是对 JIT 编译器项目(如 Numba)运作良好。这项测试是广泛的,在此过程中修补 LLVM、决定问题的严重性或向 LLVM 上游报告问题并不少见。最终,如果构建在所有支持的架构/操作系统组合上都不被认为是稳定的,那么就不会声明支持。

  2. LLVM 有时会更新其 API 或内部行为,这需要时间来找出如何在所有 llvmlite 支持的架构/操作系统组合上进行适应。

  3. llvmlite 的 LLVM 构建附带了一组补丁。这些补丁是必要的,并且通常需要移植才能在新 LLVM 版本上工作,这需要时间和测试。需要注意的是,例如随 Linux 发行版提供的 LLVM 构建可能不适用于 llvmlite 的预期用例。

为什么要静态链接到 LLVM?

llvmlite 包通过 ctypes 调用一个静态链接到 LLVM 的 C 包装器来使用 LLVM。有些人对 llvmlite 使用静态链接到 LLVM 感到惊讶,但这样做有几个重要原因

  1. LLVM API 在历史上并非跨版本稳定 - 尽管自 LLVM 4.0 以来情况有所改善,但 LLVM 版本之间仍有足够多的变化,如果版本与 llvmlite 不匹配,可能会导致编译问题。

  2. 大多数 Linux 发行版附带的 LLVM 不是 llvmlite 所需的版本 - Linux 发行版的发布周期永远不会与 LLVM 或 llvmlite 的发布周期保持一致。

  3. 我们需要修补 LLVM - llvmlite 的二进制包是基于 LLVM 构建的,并带有一些补丁,用于修复错误或添加尚未合并到上游的功能。在某些情况下,我们不得不为多个版本保留补丁,直到它们被合并到 LLVM 中。

  4. 我们不需要 LLVM 的大部分功能 - 我们对 llvmlite 的安装大小很敏感,而 LLVM 的完整构建相当大。通过静态链接到库并剪除我们不需要的符号,我们可以显著减少 llvmlite 用户所需的总磁盘空间(他们通常不需要 LLVM 的其余部分,忽略版本匹配问题)。

  5. Numba 可以同时使用多个 LLVM 构建 - 某些 Numba 目标(例如 AMD GPU)可能需要不同版本的 LLVM 或非主线的 LLVM 分支才能工作。这些其他 LLVM 可以以与 llvmlite 类似的方式进行封装,并将保持隔离。

LLVM 的静态链接在 Numba 开发早期绝不是我们的目标,但考虑到我们的限制,它似乎已成为唯一可行的解决方案。