#matrix-multiplication #matrix #row-column #dgemm #sgemm

无需std matrixmultiply

适用于f32和f64矩阵的通用矩阵乘法。对具有通用布局的矩阵进行操作(它们可以使用任意的行和列步长)。在x86平台上透明地检测和使用AVX或SSE2,以提高性能。使用微内核策略,因此实现易于并行化和优化。支持多线程。

31个版本

0.3.9 2024年7月27日
0.3.8 2023年9月21日
0.3.7 2023年5月2日
0.3.2 2021年11月20日
0.1.4 2016年3月31日

#7 in 数学

Download history 249876/week @ 2024-05-02 240954/week @ 2024-05-09 259200/week @ 2024-05-16 259795/week @ 2024-05-23 285018/week @ 2024-05-30 276337/week @ 2024-06-06 277043/week @ 2024-06-13 284948/week @ 2024-06-20 270370/week @ 2024-06-27 250282/week @ 2024-07-04 266291/week @ 2024-07-11 268583/week @ 2024-07-18 292448/week @ 2024-07-25 280851/week @ 2024-08-01 319905/week @ 2024-08-08 305324/week @ 2024-08-15

1,253,010 每月下载量
用于2,166 个Crate(直接使用19个)

MIT/Apache

180KB
3.5K SLoC

matrixmultiply

适用于f32、f64和复数矩阵的通用矩阵乘法。对具有通用布局的矩阵进行操作(它们可以使用任意的行和列步长)。

请在此处阅读API文档

目前我们提供了一些良好的微内核,可移植,适用于x86-64和AArch64 NEON,并且仅有一个操作:通用矩阵-矩阵乘法(“gemm”)。

该项目受到了BLIS项目中使用的宏/微内核矩阵乘法方法的启发。

crates

开发目标

  • 代码清晰度和可维护性
  • 可移植性和稳定的Rust
  • 性能:当有益时提供特定目标的微内核
  • 测试:测试多样化的输入,测试和基准测试所有微内核
  • 小代码量和快速编译
  • 我们不是重新实现BLAS。

基准测试

  • cargo bench适用于特殊情况和小型矩阵
  • 最佳的gemm和线程基准测试在examples/benchmarks.rs它支持自定义大小、一些配置和csv输出。使用脚本benches/benchloop.py在参数范围内运行基准测试。

关于此Crate的博客文章

近期更改

  • 0.3.9

    • 修复了s390x上的对齐审计断言,涉及掩码缓冲区的对齐;更改将所有平台上的静态对齐请求降低到(16)(macos保持不变)。
    • 使用cargo-careful进行测试
  • 0.3.8

    • 降低macos上线程局部存储值的对齐要求,因为它未受尊重并导致调试断言。(之前的issue #55)
  • 0.3.7

    • 重命名目录,避免在文件名中使用空格,以便与Bazel兼容。由@xander-zitara
  • 0.3.6

    • 修复了cgemm和no_std组合的构建问题(#76)
  • 0.3.5

    • 对复数矩阵打包和内核进行了重大改进(#75)
    • 当在x86-64上检测到该功能时,使用专门的AVX2矩阵打包函数用于sgemm、dgemm。
  • 0.3.4

    • 为AArch64 NEON (ARM)提供的sgemm、dgemm微内核实现。

      Matrixmultiply现在使用autocfg来检测rust版本,以便在Rust 1.61及以上版本中从Rust可用时启用这些内核。

    • 对矩阵打包函数进行了小的修改,以便在某些情况下由于指针别名信息的改进而更好地优化。

  • 0.3.3

    • 再次尝试修复macos的bug #55(表现为调试断言,仅出现在调试构建中)。
    • 由@Tastaturtaste更新了x86内核的注释。
    • 由@jturner314更新了MIRI/CI。
    • 对原始指针包装器的Send/Sync未来兼容性警告进行了静默处理。
  • 0.3.2

    • 添加可选功能cgemm用于复杂数值矩阵乘法函数cgemmzgemm
    • 添加可选功能constconf用于在编译时配置矩阵内核参数进行分块。改进了不同设置范围的基准测试脚本。感谢@DutchGhost提供的const-time解析函数。
    • 改进了基准测试和测试。
    • 线程现在对线程的渴望程度略有增加(取决于矩阵元素的数量)。
  • 0.3.1

    • 尝试修复bug #55,其中TLS中的掩码缓冲区在macos上似乎没有获得其请求的对齐方式。掩码缓冲区指针现在手动对齐(再次,就像在0.2.x中一样)。
    • 修复了一个小问题,我们在其中将缓冲区指针作为&T传递,而它应该是&[T].
  • 0.3.0

    • 实现使用定制的线程池的初始线程支持,以减少竞争。要使用,启用功能threading(并使用变量MATMUL_NUM_THREADS).

      配置线程数)

    • 添加了更好的基准测试程序,支持任意大小和布局,请参阅examples/benchmark.rs有关此信息;它支持csv输出,以便更好地记录测量结果

    • 最低支持的rust版本是1.41.1,并且已更新版本更新策略。

    • 已更新到Rust 2018版

    • 将CI移动到github actions(再见travis,感谢所有的鱼)。

  • 0.2.4

    • 由@vadixidav和@jturner314支持no-std模式。新(默认)功能标志“std”;使用default-features = false禁用并使用no-std。请注意,运行时CPU功能检测需要std。
    • 修复测试,以便在非x86 #49平台上正确构建,并由@bluss管理发布
  • 0.2.3

    • 更新rawpointer依赖项到0.2
    • -Ctarget-cpu=native的使用进行小的内联更改(不推荐 - 使用自动运行时功能检测)。
    • 由@bluss和@SuperFluffy对内核掩码进行了一些小的改进(#42,#41)。
  • 0.2.2

    • R. Janis Goldschmidt (@SuperFluffy)实现了新的dgemm avx和fma内核。对于行和列主输出都有快速案例。

      基准测试改进:使用fma指令将dgemm基准测试的执行时间减少了25-35%,与avx内核相比,请参阅问题#35

      使用avx dgemm内核将dgemm基准测试的执行时间减少了5-7%,与上一个版本的自动向量化内核相比。

    • R. Janis Goldschmidt (@SuperFluffy)实现了sgemm avx内核的新fma适配。

      基准测试改进:使用fma指令将sgemm基准测试的执行时间减少了10-15%,与avx内核相比,请参阅问题#35

    • 更灵活的内核选择允许内核单独设置所有其参数,确保回退(纯Rust)内核也可以针对性能进行调整,并将功能检测从gemm循环中移除。

      基准测试改进:在avx内核中将各种基准测试的执行时间减少了1-2%,请参阅#37

    • 改进测试以覆盖更多样化的输入/输出步长。

  • 0.2.1

    • 通过更好地利用连续输入来改进矩阵打包。

      基准性能提升:64×64问题在输入都是行主序或列主序时,sgemm的执行时间减少了-5%,dgemm减少了-1%。(#26)

    • 在sgemm avx内核中,像处理行主序数组一样处理列主序输出数组。

      基准性能提升:32×32问题在输出为列主序时,执行时间减少了-11%。(#27)

  • 0.2.0

    • 在x86和x86-64平台上使用运行时功能检测,如果当前执行配置中可用,则在运行时启用AVX特定的微内核。

      这意味着不需要特殊的编译器标志即可启用原生指令性能!

    • 实现专门的8×8 sgemm (f32) AVX微内核,这可以使矩阵乘法速度提高25%。

    • 使用std::alloc为对齐包装缓冲区分配内存

    • 现在我们需要Rust 1.28作为最低版本

  • 0.1.15

    • 修复了在M × K乘以K × N矩阵乘法中,当K为零时结果矩阵C未更新的bug。(这可能导致输出C在该特定场景中未初始化或值不正确。)由@jturner314(PR #21)提供。
  • 0.1.14

    • 避免未使用代码警告
  • 0.1.13

    • 当启用AVX目标功能时(使用Rust 1.14或更高版本,否则无影响)选择8x8 sgemm (f32)内核。
    • 使用rawpointer,一个从本项目提取的原始指针方法的µcrate。
  • 0.1.12

    • 在保持性能的同时进行内部清理
  • 0.1.11

    • 调整sgemm (f32)内核以优化最近Rust的性能
  • 0.1.10

    • 更新文档链接到docs.rs
  • 0.1.9

    • 解决rust nightly(1.12左右)中的优化回归问题(#9)
  • 0.1.8

    • 改进文档
  • 0.1.7

    • 通过只使用一次分配调用来减少小矩阵乘法问题的开销
  • 0.1.6

    • 在调试模式下禁用手动循环展开(更快地构建调试版本)
  • 0.1.5

    • 更新sgemm以使用4x8微内核(“仍为简单的Rust”),这提高了吞吐量10%。
  • 0.1.4

    • 准备支持对齐包装缓冲区
    • 更新dgemm以使用8x4微内核,仍为简单的Rust,当使用AVX时,吞吐量提高10-20%。
  • 0.1.3

    • 关闭一些调试打印
  • 0.1.2

    • sgemm和dgemm的基准性能有显著提升(使用AVX时为20-30%)。由于这完全取决于优化器做什么,我很乐意收到报告良好或不良性能的问题报告。
    • 使内核掩码通用化,这是一种更干净的设计
  • 0.1.1

    • 内核的微小改进

依赖关系

~100KB