Rust高性能SIMD加速库simsimd的使用:快速向量相似度计算与距离度量

以下是完整示例代码,展示了如何使用SimSIMD库进行向量相似度计算:

use simsimd::{SpatialSimilarity, BinarySimilarity, f16, bf16};

fn main() {
    // 示例1:计算f32向量之间的余弦相似度
    let vec_f32_a = vec![1.0, 2.0, 3.0];
    let vec_f32_b = vec![4.0, 5.0, 6.0];
    let cosine_f32 = f32::cosine(&vec_f32_a, &vec_f32_b).unwrap();
    println!("f32 Cosine Similarity: {}", cosine_f32);

    // 示例2:计算i8向量之间的欧氏距离
    let vec_i8_a = vec![1i8, 2, 3];
    let vec_i8_b = vec![4i8, 5, 6];
    let sqeuclidean_i8 = i8::sqeuclidean(&vec_i8_a, &vec_i8_b).unwrap();
    println!("i8 Squared Euclidean Distance: {}", sqeuclidean_i8);

    // 示例3:计算f16向量之间的内积
    let vec_f16_a = vec![1.0, 2.0, 3.0].iter().map(|&x| f16::from_f32(x)).collect::<Vec<_>>();
    let vec_f16_b = vec![4.0, 5.0, 6.0].iter().map(|&x| f16::from_f32(x)).collect::<Vec<_>>();
    let dot_f16 = f16::dot(&vec_f16_a, &vec_f16_b).unwrap();
    println!("f16 Dot Product: {}", dot_f16);

    // 示例4:计算二进制向量之间的汉明距离
    let vec_b8_a = &[0b10101010u8, 0b01010101];
    let vec_b8_b = &[0b11110000u8, 0b00001111];
    let hamming_b8 = u8::hamming(vec_b8_a, vec_b8_b).unwrap();
    println!("Binary Hamming Distance: {}", hamming_b8);

    // 示例5:使用bf16向量
    let vec_bf16_a = vec![1.0, 2.0, 3.0].iter().map(|&x| bf16::from_f32(x)).collect::<Vec<_>>();
    let vec_bf16_b = vec![4.0, 5.0, 6.0].iter().map(|&x| bf16::from_f32(x)).collect::<Vec<_>>();
    let cosine_bf16 = bf16::cosine(&vec_bf16_a, &vec_bf16_b).unwrap();
    println!("bf16 Cosine Similarity: {}", cosine_bf16);
}

1 回复

Rust高性能SIMD加速库simsimd的使用:快速向量相似度计算与距离度量

介绍

simsimd是一个使用SIMD指令集加速的Rust库,专门用于高性能向量相似度计算和距离度量。它通过底层硬件优化实现了比常规实现快数倍的运算速度,特别适合大规模向量搜索、机器学习嵌入比较等场景。

主要特性

  • 支持多种距离/相似度度量方式
  • 自动检测并使用CPU支持的SIMD指令集(SSE, AVX, NEON等)
  • 纯Rust实现,无外部依赖
  • 支持no_std环境
  • 提供f32和f64两种精度支持

安装

在Cargo.toml中添加依赖:

[dependencies]
simsimd = "3.0"

使用方法

1. 基本距离计算

use simsimd::SpatialSimilarity;

fn main() {
    let vector_a: Vec<f32> = vec![1.0, 2.0, 3.0];
    let vector_b: Vec<f32> = vec![4.0, 5.极客时间,可随时退订,详情请点击这里。
回到顶部