littlebot
Published on 2025-04-03 / 1 Visits
0

【源码】基于 C++ 的高效可移植向量处理库

项目简介

本项目名为 Highway,是一个基于 C++ 的高效可移植向量处理库。它为开发者提供可移植的 SIMD/向量内联函数,能够可靠且经济地突破软件性能的边界,充分挖掘服务器、移动设备、桌面设备等 CPU 的潜力。

项目的主要特性和功能

特性

  1. 符合预期:作为 C++ 库,精心挑选的函数能很好映射到 CPU 指令,代码比自动向量化更具可预测性和健壮性,无需大量编译器转换。
  2. 跨平台支持:支持四种架构,同一应用代码可针对八种指令集,仅需 C++11,支持四类编译器。
  3. 灵活部署:应用可在异构云或客户端设备上运行,可在运行时选择最佳指令集,也可选择单一指令集且无运行时开销。
  4. 多领域适用:提供广泛操作集,适用于图像处理、压缩、视频分析、线性代数、加密、排序和随机生成等领域。
  5. 奖励数据并行设计:提供工具助力传统数据结构加速,通过设计算法和数据结构可实现更大性能提升。

功能

  1. 支持多目标指令集:支持标量、S - SSE3、SSE4、AVX2 等多种指令集。
  2. 版本管理:遵循语义化版本系统,确保向后兼容性。
  3. 丰富测试:通过持续集成测试和发布前多平台测试保证质量。
  4. 相关模块丰富:contrib 目录包含图像类、数学库、点积和排序函数等实用工具。

安装使用步骤

安装

  1. 安装 CMake:在基于 Debian 的系统中,使用 sudo apt install cmake 进行安装。
  2. 构建库:使用标准 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

使用

  1. 快速开始:可将 examples/ 中的 benchmark 作为起点。参考 快速参考页面指令矩阵 获取操作和参数信息,查阅 FAQ 解决常见问题。
  2. 调用约定:由于 ADL 限制,调用 Highway 操作的用户代码需遵循特定规则,如位于特定命名空间、使用别名前缀或添加 using 声明。调用 Highway 操作的函数需添加 HWY_ATTR 前缀或位于 HWY_BEFORE_NAMESPACE()HWY_AFTER_NAMESPACE() 之间。
  3. 静态和动态调度:静态调度中,HWY_TARGETHWY_BASELINE_TARGETS 中最佳可用目标,函数可使用 HWY_STATIC_DISPATCH(func)(args) 调用。动态调度通过 HWY_EXPORT 宏生成函数指针表,使用 HWY_DYNAMIC_DISPATCH(func)(args) 调用最佳函数指针。
  4. 编译器标志:应用应启用优化编译,Clang 和 GCC 使用 -O2 通常足够。MSVC 建议使用 /Gv 编译,若使用 AVX2 目标和半宽向量,需使用 /arch:AVX2 编译。
  5. 循环向量化:可通过多种方式对循环进行向量化,如确保输入输出填充、处理全向量并包含之前元素、使用 Transform* 函数、全向量处理后接标量循环或带掩码的最终调用等。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】