1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
// Copyright 2016 bluss // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! //! General matrix multiplication for f32, f64 matrices. //! //! Allows arbitrary row, column strided matrices. //! //! Uses the same microkernel algorithm as [BLIS][bl], but in a much simpler //! and less featureful implementation. //! See their [multithreading][mt] page for a very good diagram over how //! the algorithm partitions the matrix (*Note:* this crate does not implement //! multithreading). //! //! [bl]: https://github.com/flame/blis //! //! [mt]: https://github.com/flame/blis/wiki/Multithreading //! //! ## Matrix Representation //! //! **matrixmultiply** supports matrices with general stride, so a matrix //! is passed using a pointer and four integers: //! //! - `a: *const f32`, pointer to the first element in the matrix //! - `m: usize`, number of rows //! - `k: usize`, number of columns //! - `rsa: isize`, row stride //! - `csa: isize`, column stride //! //! In this example, A is a m by k matrix. `a` is a pointer to the element at //! index *0, 0*. //! //! The *row stride* is the pointer offset (in number of elements) to the //! element on the next row. It’s the distance from element *i, j* to *i + 1, //! j*. //! //! The *column stride* is the pointer offset (in number of elements) to the //! element in the next column. It’s the distance from element *i, j* to *i, //! j + 1*. //! //! For example for a contiguous matrix, row major strides are *rsa=k, //! csa=1* and column major strides are *rsa=1, csa=m*. //! //! Stides can be negative or even zero, but for a mutable matrix elements //! may not alias each other. #![doc(html_root_url = "https://docs.rs/matrixmultiply/0.1/")] extern crate rawpointer; #[macro_use] mod debugmacros; #[macro_use] mod loopmacros; mod archparam; mod kernel; mod gemm; mod sgemm_kernel; mod dgemm_kernel; mod util; pub use gemm::sgemm; pub use gemm::dgemm;