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
每月 596 次下载
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进行点积,那么也许可以。