Highway 是一个提供可移植 SIMD/向量内联函数的 C++ 库。
之前采用 Apache 2 许可,现在双重许可为 Apache 2 / BSD-3。
我们热衷于高性能软件。我们看到 CPU(服务器、移动设备、桌面)中存在巨大的未开发潜力。Highway 适用于那些希望可靠且经济地突破软件可能性边界的工程师。
CPU 提供 SIMD/向量指令,可以对多个数据项应用相同的操作。这可以将能耗降低约 5 倍,因为执行的指令更少。我们通常还能看到 5-10 倍的速度提升。
Highway 使 SIMD/向量编程变得实用可行,遵循以下指导原则:
符合预期:Highway 是一个 C++ 库,具有精心选择的函数,无需大量编译器转换即可很好地映射到 CPU 指令。与自动向量化相比,生成的代码对代码更改/编译器更新更具可预测性和鲁棒性。
适用于广泛使用的平台:Highway 支持五种架构;相同的应用程序代码可以针对各种指令集,包括那些具有"可扩展"向量(编译时大小未知)的指令集。Highway 仅需要 C++11,并支持四个编译器系列。如果您想在其他平台上使用 Highway,请提出问题。
部署灵活:使用 Highway 的应用程序可以在异构云或客户端设备上运行,在运行时选择最佳可用的指令集。或者,开发人员可以选择针对单一指令集,无任何运行时开销。在这两种情况下,应用程序代码都是相同的,只需将 HWY_STATIC_DISPATCH
替换为 HWY_DYNAMIC_DISPATCH
并添加一行代码。
适用于各种领域:Highway 提供了广泛的操作集,用于图像处理(浮点)、压缩、视频分析、线性代数、密码学、排序和随 机生成。我们认识到新的用例可能需要额外的操作,并乐意在合理的情况下添加它们(例如,在某些架构上不会出现性能断崖)。如果您想讨论,请提出问题。
奖励数据并行设计:Highway 提供了 Gather、MaskedLoad 和 FixedTag 等工具,以实现对传统数据结构的加速。然而,最大的收益是通过为可扩展向量设计算法和数据结构来实现的。有用的技术包括批处理、数组结构布局和对齐/填充分配。
我们推荐以下资源作为入门:
使用 Compiler Explorer 的在线演示:
我们观察到 Highway 在以下开源项目中被引用,这些项目通过 sourcegraph.com 找到。大多数是 GitHub 仓库。如果您想添加您的项目或直接链接到它,请随时提出问题或通过以下电子邮件与我们联系。
其他
如果您想获取 Highway,除了从这个 GitHub 仓库克隆或将其用作 Git 子模块外,您还可以在以下包管理器或 仓库中找到它:
另请参阅 https://repology.org/project/highway-simd-library/versions 的列表。
Highway 支持 24 个目标,按平台字母顺序列出:
EMU128
、SCALAR
;NEON_WITHOUT_AES
、NEON
、NEON_BF16
、SVE
、SVE2
、SVE_256
、
SVE2_128
;Z14
、Z15
;PPC8
(v2.07)、PPC9
(v3.0)、PPC10
(v3.1B,由于编译器错误尚不支持,
参见 #1207;还需要 QEMU 7.2);RVV
(1.0);WASM
、WASM_EMU256
(wasm128 的 2 倍展开版本,
如果定义了 HWY_WANT_WASM2
则启用。在可能被未来版本的 WASM 取代之前,
这将继续得到支持。);SSE2
SSSE3
(~Intel Core)SSE4
(~Nehalem,还包括 AES + CLMUL)AVX2
(~Haswell,还包括 BMI2 + F16 + FMA)AVX3
(~Skylake,AVX-512F/BW/CD/DQ/VL)AVX3_DL
(~Icelake,包括 BitAlg + CLMUL + GFNI + VAES + VBMI +
VBMI2 + VNNI + VPOPCNT;除非为静态分派编译,否则需要通过定义 HWY_WANT_AVX3_DL
选择加入)AVX3_ZEN4
(类似 AVX3_DL,但为 AMD Zen4 优化;如果为静态分派编译,
需要通过定义 HWY_WANT_AVX3_ZEN4
选择加入,但对于运行时分派默认启用)AVX3_SPR
(~Sapphire Rapids,包括 AVX-512FP16)我们的政策是,除非另有说明,只要可以使用当前支持的 Clang 或 GCC(交叉)编译,并使用 QEMU 进行测试,就会继续支持目标。如果目标可以使用 LLVM trunk 编译,并使用我们版本的 QEMU 进行测试而无需额外标志,那么它就有资格纳入我们的持续测试基础设施。否则,目标将在发布前使用选定版本/配置的 Clang 和 GCC 进行手动测试。
SVE 最初使用 farm_sve 进行测试(参见致谢)。
Highway 发布旨在遵循 semver.org 系统(主版本号.次版本号.修订号),在向后兼容的添加后递增次版本号,在向后兼容的修复后递增修订号。我们建议使用发布版(而不是 Git 提示),因为它们经过更广泛的测试,详见下文。
当前版本 1.0 表示更加注重向后兼容性。使用文档化功能的应用程序将与具有相同主版本号的未来更新保持兼容。
持续集成测试使用最新版本的 Clang(在原生 x86 上运行,或在 RISC-V 和 Arm 上使用 QEMU)和 MSVC 2019(v19.28,在原生 x86 上运行)进行构建。
在发布之前,我们还会在 x86 上使用 Clang 和 GCC 进行测试,并通过 GCC 交叉编译在 Armv7/8 上进行测试。有关详细信息,请参阅测试流程。
contrib
目录包含SIMD相关的实用工具:一个带对齐行的图像类、一个数学库(已实现16个函数,主要是三角函数),以及用于计算点积和排序的函数。
如果您只需要x86支持,也可以使用Agner Fog的 VCL向量类库。它包含许多函数,包括一个完整的数学库。