项目简介
本项目名为 Highway,是一个基于 C++ 的高效可移植向量处理库。它为开发者提供可移植的 SIMD/向量内联函数,能够可靠且经济地突破软件性能的边界,充分挖掘服务器、移动设备、桌面设备等 CPU 的潜力。
项目的主要特性和功能
特性
- 符合预期:作为 C++ 库,精心挑选的函数能很好映射到 CPU 指令,代码比自动向量化更具可预测性和健壮性,无需大量编译器转换。
- 跨平台支持:支持四种架构,同一应用代码可针对八种指令集,仅需 C++11,支持四类编译器。
- 灵活部署:应用可在异构云或客户端设备上运行,可在运行时选择最佳指令集,也可选择单一指令集且无运行时开销。
- 多领域适用:提供广泛操作集,适用于图像处理、压缩、视频分析、线性代数、加密、排序和随机生成等领域。
- 奖励数据并行设计:提供工具助力传统数据结构加速,通过设计算法和数据结构可实现更大性能提升。
功能
- 支持多目标指令集:支持标量、S - SSE3、SSE4、AVX2 等多种指令集。
- 版本管理:遵循语义化版本系统,确保向后兼容性。
- 丰富测试:通过持续集成测试和发布前多平台测试保证质量。
- 相关模块丰富:contrib 目录包含图像类、数学库、点积和排序函数等实用工具。
安装使用步骤
安装
- 安装 CMake:在基于 Debian 的系统中,使用
sudo apt install cmake
进行安装。 - 构建库:使用标准 CMake 工作流程构建,创建并进入构建目录
mkdir -p build && cd build
,运行cmake ..
,最后使用make -j && make test
完成构建和测试。也可运行run_tests.sh
(Windows 下为run_tests.bat
)。若使用 Bazel 构建,它也受支持但测试较少。在为 Arm v7 构建时,需在 CMake 命令行添加-DHWY_CMAKE_ARM7:BOOL = ON
。
使用
- 快速开始:可将
examples/
中的benchmark
作为起点。参考 快速参考页面 和 指令矩阵 获取操作和参数信息,查阅 FAQ 解决常见问题。 - 调用约定:由于 ADL 限制,调用 Highway 操作的用户代码需遵循特定规则,如位于特定命名空间、使用别名前缀或添加 using 声明。调用 Highway 操作的函数需添加
HWY_ATTR
前缀或位于HWY_BEFORE_NAMESPACE()
和HWY_AFTER_NAMESPACE()
之间。 - 静态和动态调度:静态调度中,
HWY_TARGET
是HWY_BASELINE_TARGETS
中最佳可用目标,函数可使用HWY_STATIC_DISPATCH(func)(args)
调用。动态调度通过HWY_EXPORT
宏生成函数指针表,使用HWY_DYNAMIC_DISPATCH(func)(args)
调用最佳函数指针。 - 编译器标志:应用应启用优化编译,Clang 和 GCC 使用
-O2
通常足够。MSVC 建议使用/Gv
编译,若使用 AVX2 目标和半宽向量,需使用/arch:AVX2
编译。 - 循环向量化:可通过多种方式对循环进行向量化,如确保输入输出填充、处理全向量并包含之前元素、使用
Transform*
函数、全向量处理后接标量循环或带掩码的最终调用等。
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】