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 数学
1,253,010 每月下载量
用于2,166 个Crate(直接使用19个)
180KB
3.5K SLoC
matrixmultiply
适用于f32、f64和复数矩阵的通用矩阵乘法。对具有通用布局的矩阵进行操作(它们可以使用任意的行和列步长)。
请在此处阅读API文档
目前我们提供了一些良好的微内核,可移植,适用于x86-64和AArch64 NEON,并且仅有一个操作:通用矩阵-矩阵乘法(“gemm”)。
该项目受到了BLIS项目中使用的宏/微内核矩阵乘法方法的启发。
开发目标
- 代码清晰度和可维护性
- 可移植性和稳定的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用于复杂数值矩阵乘法函数cgemm和zgemm
- 添加可选功能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