#vector-math #vector #simd-vector #simd #linear-algebra

no-std cfavml

CF 加速向量数学库,提供用于向量操作的 SIMD 优化例程

5 个不稳定版本

新版本 0.3.0 2024 年 8 月 21 日
0.2.0 2024 年 8 月 16 日
0.1.2 2024 年 8 月 4 日
0.1.1 2024 年 8 月 4 日
0.1.0 2024 年 8 月 4 日

并发 中排名 #94

Download history 228/week @ 2024-08-01 76/week @ 2024-08-08 280/week @ 2024-08-15

每月 596 次下载

MIT/Apache

470KB
11K SLoC

CFAVML

CF 加速向量数学库

使用 SIMD 在 Rust 基础上实现各种加速向量操作。

这是核心基础库,无依赖,仅依赖 core 库,不执行任何分配。

本库保证与 no-std 兼容,可以通过禁用 std 功能标志进行调整

默认设置
cfavml = "0.3.0" 
no-std 设置
cfavml = { version = "0.3.0", default-features = false }

重要版本升级说明

如果您正在升级到破坏性版本,例如从 0.2.0 升级到 0.3.0,可能会有一些重要的更改影响您的系统,尽管我尽量避免破坏公共 safe API。

  • 0.3.0+ 中 AVX512 所需的 CPU 功能已更改
    • 0.3.0 之前,当只有 avx512f CPU 功能可用时使用了 avx512,因为这是 AVX512 的基础/基础版本。然而,在 0.3.0 中,我们引入了更广泛的 cmp 操作 (eq/neq/lt/lte/gt/gte),这改变了我们所需的 CPU 功能,包括 avx512bw
    • 这意味着在 unsafe API 上,您必须更新功能检查以包括 avx512bw
    • safe API 不需要更改,但可能在一些第一代 AVX512 CPU 上回退到 AVX2,例如 Skylake

可用的 SIMD 架构

  • AVX2
  • AVX2 + FMA
  • AVX512 (avx512f + avx512bw) 仅限 nightly
  • NEON
  • 回退(通常由 LLVM 自动优化为 SSE,适用于 x86)

支持的基元

  • f32
  • f64
  • i8
  • i16
  • i32
  • i64
  • u8
  • u16
  • u32
  • u64
关于非浮点除法的说明

目前,对非浮点基元的除法操作仍然是标量操作,因为在SIMD中执行整数除法现在非常难以高效进行,并且在阅读代码时增加了显著的认知负担。

说实话,如果你在进行大量的整数除法,我对你的应用程序有一些严重的问题...

支持的操作

空间距离

这些是用于诸如KNN分类或索引构建之类的操作的例程。

  • 两个向量的点积
  • 两个向量的余弦距离
  • 两个向量的平方欧几里得距离

算术运算

  • 将单个值添加到向量中
  • 从向量中减去单个值
  • 将向量乘以单个值
  • 将向量除以单个值
  • 垂直相加两个向量
  • 垂直减去两个向量
  • 垂直相乘两个向量
  • 垂直除以两个向量

比较

  • 向量中的水平最大元素
  • 向量中的水平最小元素
  • 两个向量的垂直最大元素
  • 两个向量的垂直最小元素
  • 向量的垂直最大元素和广播值
  • 向量的垂直最小元素和广播值
  • 向量与广播值的EQ/NEQ/LT/LTE/GT/GTE比较
  • 两个向量的EQ/NEQ/LT/LTE/GT/GTE比较

聚合

  • 向量的水平总和

其他

  • 向量的平方L2范数

危险的例程命名约定

如果你看过danger文件夹,你会注意到一些事情,其中之一是SIMD操作在SimdRegister<T>特质后面,这为我们提供了对各种SIMD寄存器类型和架构的泛型抽象。

这个特质与Math<T>特质结合形成了所有操作的核心,并以泛型函数的形式提供(没有目标特性)

  • generic_dot
  • generic_squared_euclidean
  • generic_cosine
  • generic_squared_norm
  • generic_cmp_max
  • generic_cmp_max_vector
  • generic_cmp_max_value
  • generic_cmp_min
  • generic_cmp_min_vector
  • generic_cmp_min_value
  • generic_cmp_eq_vector
  • generic_cmp_eq_value
  • generic_cmp_neq_vector
  • generic_cmp_neq_value
  • generic_cmp_lt_vector
  • generic_cmp_lt_value
  • generic_cmp_lte_vector
  • generic_cmp_lte_value
  • generic_cmp_gt_vector
  • generic_cmp_gt_value
  • generic_cmp_gte_vector
  • generic_cmp_gte_value
  • generic_sum
  • generic_add_value
  • generic_sub_value
  • generic_mul_value
  • generic_div_value
  • generic_add_vector
  • generic_sub_vector
  • generic_mul_vector
  • generic_div_vector

我们还导出了具有预指定目标特征的函数,针对每个SIMD寄存器类型,并在cfavml::danger::export_*模块中找到。虽然不建议直接使用这些例程,除非你知道自己在做什么。

特性

  • nightly 启用仅在nightly平台上可用的优化。
    • 由于目前AVX512支持不稳定,因此这是必要的。

这是BLAS的替代品吗?

至少不是,除非你只做点积... BLAS和LAPACK非常大,我当然不在市场上实现所有的BLAS例程,但话虽如此,如果你的应用程序与ndarray类似,只使用BLAS进行点积,那么也许可以。

无运行时依赖