Skip to content

Commit eb41afa

Browse files
committed
Merge pull request #134 from bluss/blas-matmul
Switch to blas-sys and use BLAS in .mat_mul
2 parents 30b7019 + bfb52b5 commit eb41afa

File tree

12 files changed

+423
-124
lines changed

12 files changed

+423
-124
lines changed

.travis.yml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
language: rust
2-
sudo: false
2+
# use trusty for newer openblas
3+
sudo: required
4+
dist: trusty
35
matrix:
46
include:
57
- rust: stable
8+
env:
9+
- FEATURES='test'
610
- rust: beta
711
- rust: nightly
812
env:
9-
- FEATURES='assign_ops rustc-serialize'
13+
- FEATURES='test'
1014
- BENCH=1
1115
branches:
1216
only:
1317
- master
18+
addons:
19+
apt:
20+
packages:
21+
- libopenblas-dev
1422
script:
1523
- |
1624
cargo build --verbose &&

Cargo.toml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,24 @@ version = "0.3.16"
3535
optional = true
3636

3737
[dependencies]
38-
rblas = { version = "0.0.13", optional = true }
38+
blas-sys = { version = "0.5", optional = true, default-features = false }
3939

40-
#[dependencies.serde]
41-
#version = "0.4"
42-
#optional = true
40+
# rblas is deprecatedish
41+
rblas = { version = "0.0.13", optional = true }
4342

4443
[features]
4544

4645
assign_ops = []
4746

47+
blas = ["blas-sys"]
48+
blas-openblas-sys = [
49+
"blas",
50+
"blas-sys/openblas",
51+
"blas-sys/openblas-provider/system-openblas",
52+
]
53+
4854
# This feature is used for testing
49-
all = ["assign_ops", "rblas", "rustc-serialize"]
55+
test = ["blas-openblas-sys", "rustc-serialize"]
5056

5157
[profile.release]
5258
[profile.bench]

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ DOCCRATES = ndarray
33
# deps to delete the generated docs
44
RMDOCS =
55

6-
FEATURES = "assign_ops rustc-serialize rblas"
6+
FEATURES = "assign_ops rustc-serialize rblas blas"
77

88
VERSIONS = $(patsubst %,target/VERS/%,$(DOCCRATES))
99

benches/bench1.rs

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -433,19 +433,52 @@ fn bench_col_iter(bench: &mut test::Bencher)
433433
bench.iter(|| for elt in it.clone() { black_box(elt); })
434434
}
435435

436-
#[bench]
437-
fn bench_mat_mul_large(bench: &mut test::Bencher)
438-
{
439-
let a = OwnedArray::<f32, _>::zeros((64, 64));
440-
let b = OwnedArray::<f32, _>::zeros((64, 64));
441-
let a = black_box(a.view());
442-
let b = black_box(b.view());
443-
bench.iter(|| a.mat_mul(&b));
436+
macro_rules! mat_mul {
437+
($modname:ident, $ty:ident, $(($name:ident, $m:expr, $n:expr, $k:expr))+) => {
438+
mod $modname {
439+
use test::{black_box, Bencher};
440+
use ndarray::OwnedArray;
441+
$(
442+
#[bench]
443+
fn $name(bench: &mut Bencher)
444+
{
445+
let a = OwnedArray::<$ty, _>::zeros(($m, $n));
446+
let b = OwnedArray::<$ty, _>::zeros(($n, $k));
447+
let a = black_box(a.view());
448+
let b = black_box(b.view());
449+
bench.iter(|| a.mat_mul(&b));
450+
}
451+
)+
452+
}
453+
}
454+
}
455+
456+
mat_mul!{mat_mul_f32, f32,
457+
(m004, 4, 4, 4)
458+
(m007, 7, 7, 7)
459+
(m008, 8, 8, 8)
460+
(m012, 12, 12, 12)
461+
(m016, 16, 16, 16)
462+
(m032, 32, 32, 32)
463+
(m064, 64, 64, 64)
464+
(m127, 127, 127, 127)
465+
(mix16x4, 32, 4, 32)
466+
(mix32x2, 32, 2, 32)
467+
}
468+
469+
mat_mul!{mat_mul_i32, i32,
470+
(m004, 4, 4, 4)
471+
(m007, 7, 7, 7)
472+
(m008, 8, 8, 8)
473+
(m012, 12, 12, 12)
474+
(m016, 16, 16, 16)
475+
(m032, 32, 32, 32)
476+
(m064, 64, 64, 64)
444477
}
445478

446479
#[cfg(feature = "rblas")]
447480
#[bench]
448-
fn bench_mat_mul_rblas_large(bench: &mut test::Bencher)
481+
fn bench_mat_mul_rblas_64(bench: &mut test::Bencher)
449482
{
450483
use rblas::Gemm;
451484
use rblas::attribute::Transpose;

src/arrayformat.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,10 @@ impl<'a, A: fmt::Debug, S, D: Dimension> fmt::Debug for ArrayBase<S, D>
105105
where S: Data<Elem=A>,
106106
{
107107
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
108-
format_array(self, f, <_>::fmt)
108+
// Add extra information for Debug
109+
try!(format_array(self, f, <_>::fmt));
110+
try!(write!(f, " shape={:?}, strides={:?}", self.shape(), self.strides()));
111+
Ok(())
109112
}
110113
}
111114

src/blas.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
//! I know), instead output its own error conditions, for example on dimension
5656
//! mismatch in a matrix multiplication.
5757
//!
58+
#![cfg_attr(has_deprecated, deprecated(note="`rblas` integration will move to its own crate."))]
5859

5960
use std::os::raw::{c_int};
6061

0 commit comments

Comments
 (0)