faer

faer is a collection of crates that implement low level linear algebra routines in pure Rust. The aim is to eventually provide a fully featured library for linear algebra with focus on portability, correctness, and performance.

See the official website and the docs.rs documentation for code examples and usage instructions.

Questions about using the library, contributing, and future directions can be discussed in the Discord server.

faer-core

Documentation Crate

The core module implements matrix structures, as well as BLAS-like matrix operations such as matrix multiplication and solving triangular linear systems.

faer-cholesky

Documentation Crate

The Cholesky module implements the LLT and LDLT matrix decompositions. These allow for solving symmetric/hermitian (+positive definite for LLT) linear systems.

faer-lu

Documentation Crate

The LU module implements the LU factorization with row pivoting, as well as the version with full pivoting.

faer-qr

Documentation Crate

The QR module implements the QR decomposition with no pivoting, as well as the version with column pivoting.

faer-svd

Documentation Crate

The SVD module implements the singular value decomposition.

faer-evd

Documentation Crate

The EVD module implements the eigenvalue decomposition for symmetric matrices (non symmetric matrix support is WIP).

Contributing

If you'd like to contribute to faer, check out the list of "good first issue" issues. These are all (or should be) issues that are suitable for getting started, and they generally include a detailed set of instructions for what to do. Please ask questions on the Discord server or the issue itself if anything is unclear!

Benchmarks

The benchmarks were run on an 11th Gen Intel(R) Core(TM) i5-11400 @ 2.60GHz with 12 threads.
- nalgebra is used with the matrixmultiply backend - ndarray is used with the openblas backend - eigen is compiled with -march=native -O3 -fopenmp

All computations are done on column major matrices containing f64 values.

Matrix multiplication

Multiplication of two square matrices of dimension n.

n faer faer(par) ndarray nalgebra eigen 32 1.1µs 1.1µs 1.1µs 1.9µs 1.2µs 64 8µs 8µs 7.9µs 10.8µs 5.1µs 96 27.6µs 11.2µs 26.2µs 34.4µs 10.1µs 128 65.5µs 16.9µs 35.5µs 79.3µs 32.8µs 192 216.9µs 53.4µs 70.3µs 259.5µs 52.2µs 256 511.1µs 116.3µs 200µs 602.1µs 143.9µs 384 1.7ms 363.5µs 430.7µs 2ms 327.7µs 512 4.1ms 845.5µs 1.3ms 4.7ms 1.2ms 640 8ms 1.7ms 2.3ms 9.3ms 2ms 768 14ms 3.1ms 3.6ms 16.1ms 3.2ms 896 22.3ms 5.6ms 6.5ms 25.8ms 5.9ms 1024 34.2ms 8.2ms 9.6ms 38.9ms 8.3ms

Triangular solve

Solving AX = B in place where A and B are two square matrices of dimension n, and A is a triangular matrix.

n faer faer(par) ndarray nalgebra eigen 32 2.4µs 2.4µs 8.5µs 7.1µs 2.9µs 64 10.2µs 10.3µs 25.8µs 34.4µs 13.5µs 96 29.4µs 26.6µs 54.4µs 102.8µs 36.4µs 128 58.7µs 41.4µs 145µs 240.4µs 83µs 192 173.4µs 93µs 262.6µs 801µs 213.1µs 256 377.2µs 166.2µs 633µs 1.8ms 491µs 384 1.1ms 334.9µs 1.4ms 6.4ms 1.3ms 512 2.6ms 667µs 3.5ms 15ms 3.2ms 640 4.8ms 1.5ms 5.7ms 30.2ms 5.4ms 768 8.1ms 2.4ms 9.3ms 51.8ms 9.3ms 896 12.4ms 3.6ms 13.4ms 81.6ms 14ms 1024 19.1ms 5.3ms 20.2ms 124.6ms 22.8ms

Triangular inverse

Computing A^-1 where A is a square triangular matrix with dimension n.

n faer faer(par) ndarray nalgebra eigen 32 3.7µs 11.1µs 8.6µs 7µs 2.9µs 64 11.6µs 18.1µs 25.9µs 34.5µs 13.3µs 96 27.8µs 37.4µs 54.4µs 103.2µs 36.4µs 128 41.1µs 51.5µs 145.3µs 240.5µs 83.1µs 192 104.7µs 92.5µs 263.4µs 803.6µs 213.5µs 256 189.1µs 135.5µs 639.8µs 1.8ms 491.5µs 384 522.9µs 269.7µs 1.4ms 6.6ms 1.3ms 512 1.1ms 449.4µs 3.5ms 15.6ms 3.2ms 640 2ms 635.6µs 5.7ms 30.7ms 5.5ms 768 3.2ms 1ms 9.4ms 52.7ms 9.3ms 896 4.8ms 2.3ms 13.5ms 83ms 14ms 1024 7.2ms 2.5ms 20.1ms 126.3ms 22.8ms

Cholesky decomposition

Factorizing a square matrix with dimension n as L×L.T, where L is lower triangular.

n faer faer(par) ndarray nalgebra eigen 32 2µs 2µs 3.3µs 2.5µs 2.3µs 64 7.5µs 7.3µs 38µs 12.9µs 8.8µs 96 19.2µs 19.2µs 117µs 38.2µs 20.5µs 128 30.9µs 30.9µs 165.6µs 92.6µs 37.7µs 192 90µs 98.6µs 298.7µs 295µs 99.1µs 256 167.9µs 152µs 703.3µs 677.1µs 204.8µs 384 477.6µs 421.5µs 1.2ms 2.2ms 557.9µs 512 1.1ms 627.5µs 3.8ms 5.7ms 1.2ms 640 1.9ms 1.2ms 3.3ms 10.8ms 2.1ms 768 3.3ms 1.7ms 5.5ms 18.8ms 3.5ms 896 5.1ms 2.6ms 7ms 29.3ms 5.5ms 1024 7.9ms 3.3ms 14.9ms 43.5ms 8.2ms

LU decomposition with partial pivoting

Factorizing a square matrix with dimension n as P×L×U, where P is a permutation matrix, L is unit lower triangular and U is upper triangular.

n faer faer(par) ndarray nalgebra eigen 32 3.8µs 3.7µs 5.6µs 4.9µs 4µs 64 18.1µs 19.8µs 17.5µs 22.4µs 15.5µs 96 47.6µs 44.7µs 34.8µs 68.7µs 36.6µs 128 93.2µs 95µs 98.7µs 167.3µs 127.4µs 192 247.3µs 260.7µs 189.1µs 527.7µs 426.2µs 256 480.8µs 502µs 374.7µs 1.3ms 820.9µs 384 1.3ms 1.2ms 1.2ms 4.5ms 1.9ms 512 2.8ms 2.4ms 1.6ms 11.1ms 4.4ms 640 4.9ms 3.9ms 2.3ms 20.7ms 5.6ms 768 7.7ms 6ms 3.4ms 35.8ms 8.7ms 896 11.4ms 8.2ms 4.8ms 56.4ms 11.3ms 1024 16.9ms 11.2ms 6.9ms 89.2ms 17.4ms

LU decomposition with full pivoting

Factorizing a square matrix with dimension n as P×L×U×Q.T, where P and Q are permutation matrices, L is unit lower triangular and U is upper triangular.

n faer faer(par) ndarray nalgebra eigen 32 8.3µs 8.3µs - 14.9µs 12µs 64 34.5µs 34.6µs - 105.1µs 71.7µs 96 93.3µs 92.1µs - 345.5µs 206.3µs 128 208.8µs 205.7µs - 834.6µs 463.7µs 192 569.8µs 567.5µs - 2.7ms 1.4ms 256 1.3ms 1.4ms - 6.5ms 3.3ms 384 4.4ms 4.2ms - 21.9ms 10.8ms 512 11.1ms 8.3ms - 52.5ms 26.5ms 640 19.9ms 12.7ms - 101.5ms 49.8ms 768 33.6ms 18.1ms - 175.4ms 86.2ms 896 52.3ms 25.7ms - 280.3ms 134.4ms 1024 79.6ms 36ms - 430ms 205.4ms

QR decomposition with no pivoting

Factorizing a square matrix with dimension n as QR, where Q is unitary and R is upper triangular.

n faer faer(par) ndarray nalgebra eigen 32 11.9µs 11.9µs 15.4µs 7.8µs 6.9µs 64 34.9µs 34.8µs 60.5µs 43.2µs 47.9µs 96 71.4µs 71.4µs 327.4µs 141.6µs 79.8µs 128 125.2µs 125.2µs 824.9µs 320.2µs 155.7µs 192 323.2µs 323.4µs 1.8ms 1.1ms 383.1µs 256 654.9µs 709.5µs 5.2ms 2.4ms 799.8µs 384 1.9ms 1.7ms 8ms 8ms 2.1ms 512 4.1ms 3.1ms 16.4ms 18.7ms 4.5ms 640 7.4ms 4.5ms 22.2ms 36ms 8ms 768 12.2ms 6.7ms 35.1ms 62.2ms 13.3ms 896 18.6ms 9.4ms 46.5ms 98.2ms 20.5ms 1024 27.7ms 13.2ms 66.3ms 151.4ms 30.6ms

QR decomposition with column pivoting

Factorizing a square matrix with dimension n as QRP, where P is a permutation matrix, Q is unitary and R is upper triangular.

n faer faer(par) ndarray nalgebra eigen 32 23.7µs 37.6µs - 17.9µs 9.5µs 64 96.4µs 123.3µs - 125.7µs 38.5µs 96 231.6µs 263.1µs - 421.4µs 97.8µs 128 452.9µs 491.7µs - 984.7µs 218.5µs 192 1.1ms 1.2ms - 3.3ms 617.1µs 256 2.3ms 2.2ms - 7.6ms 1.4ms 384 6.6ms 4.5ms - 25.4ms 5.4ms 512 14.7ms 7.8ms - 59.6ms 14.2ms 640 26.5ms 12.3ms - 115.8ms 25.9ms 768 44.4ms 17.3ms - 199.8ms 46ms 896 68.5ms 23ms - 319.5ms 69.1ms 1024 104.8ms 42.1ms - 492ms 118.6ms

Matrix inverse

Computing the inverse of a square matrix with dimension n.

n faer faer(par) ndarray nalgebra eigen 32 14µs 30.6µs 10.3µs 20.9µs 10.7µs 64 51.4µs 75.5µs 38.1µs 98.4µs 45.7µs 96 134.2µs 134.7µs 188.5µs 291.5µs 118.9µs 128 222.8µs 203.9µs 349.4µs 663.6µs 345.5µs 192 607.6µs 480.5µs 643.4µs 2.2ms 965.1µs 256 1.1ms 832.3µs 1.1ms 5.6ms 2ms 384 3.2ms 1.9ms 2.4ms 19.1ms 5.1ms 512 6.7ms 3.6ms 4.6ms 44.6ms 11.9ms 640 12.5ms 6.6ms 7.3ms 85.4ms 19.3ms 768 20.5ms 9.9ms 11.3ms 145.1ms 31.7ms 896 32.1ms 14.9ms 16.8ms 228.9ms 44.4ms 1024 47ms 21.9ms 24ms 359.6ms 68.9ms

Square matrix singular value decomposition

Computing the SVD of a square matrix with dimension n.

n faer faer(par) ndarray nalgebra eigen 32 140µs 171.6µs 92.6µs 103.9µs 228.8µs 64 494.3µs 461.6µs 680.3µs 566.5µs 1ms 96 1.1ms 1.1ms 1.7ms 1.7ms 2.5ms 128 2ms 1.9ms 2.9ms 4.5ms 4.2ms 192 4.6ms 4.5ms 6.7ms 14.8ms 9.9ms 256 8.8ms 7.5ms 11.6ms 46ms 17.2ms 384 23.2ms 15.8ms 25.7ms 121ms 42.1ms 512 50.1ms 29.2ms 51.6ms 449ms 82.8ms 640 85.8ms 54.4ms 78.1ms 652.2ms 129.1ms 768 140.1ms 81ms 122.7ms 1.43s 202ms 896 211.1ms 114.4ms 172.8ms 2.09s 281.4ms 1024 317ms 157ms 254.7ms 3.89s 415.7ms

Thin matrix singular value decomposition

Computing the SVD of a rectangular matrix with shape (4096, n).

n faer faer(par) ndarray nalgebra eigen 32 1.2ms 1.3ms 5.4ms 5.1ms 3.1ms 64 3.4ms 3.3ms 15.8ms 20.2ms 8.8ms 96 7ms 5.9ms 30.2ms 44.6ms 18.9ms 128 11.5ms 8.8ms 47.8ms 81.2ms 35.8ms 192 24.3ms 17.1ms 63.6ms 183.9ms 56.5ms 256 42ms 26.8ms 83.9ms 385.2ms 94.3ms 384 92.2ms 49.5ms 135ms 922.1ms 209.9ms 512 166.6ms 80.1ms 305.2ms 2.05s 392.3ms 640 262.6ms 119.1ms 293.4ms 3.3s 632ms 768 388.2ms 190.3ms 445.7ms 5.25s 924.7ms 896 540.4ms 253.5ms 553.1ms 7.41s 1.31s 1024 735ms 329.6ms 856.1ms 10.83s 1.72s

Hermitian matrix eigenvalue decomposition

Computing the EVD of a hermitian matrix with shape (n, n).

n faer faer(par) ndarray nalgebra eigen 32 63.6µs 62.9µs 127.5µs 49.9µs 44µs 64 249.3µs 239µs 970.3µs 293.1µs 190.7µs 96 597.1µs 574.7µs 2.7ms 862µs 509.6µs 128 987.5µs 938.5µs 5.4ms 1.9ms 1.1ms 192 2.4ms 2.3ms 15.7ms 5.8ms 2.9ms 256 4.3ms 3.8ms 34.2ms 13.2ms 6.3ms 384 10.9ms 9.3ms 105.7ms 42.9ms 21.1ms 512 22.4ms 16.9ms 180.2ms 102.1ms 52.1ms 640 38ms 27.3ms 268.7ms 192ms 98.5ms 768 61.1ms 39.7ms 407.6ms 327.4ms 168.9ms 896 91.1ms 55.3ms 618.6ms 517.6ms 263.8ms 1024 135.7ms 76.9ms 888ms 794.4ms 406.1ms