Skip to content

Commit a8f91c0

Browse files
Block Decomposition JMH
- improved JMH coverage of block decomposition internals - combined single and concurrent into one benchmark Accessors - Reshape instead of throwing exception if there's a miss match matrix shape miss match for passed in matrices - Standard practice in EJML
1 parent b0049a5 commit a8f91c0

8 files changed

Lines changed: 61 additions & 242 deletions

main/ejml-ddense/benchmarks/src/org/ejml/dense/block/decompose/chol/BenchmarkDecompositionCholesky_DDRB.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.ejml.data.DMatrixRBlock;
2222
import org.ejml.dense.block.MatrixOps_DDRB;
2323
import org.ejml.dense.block.decomposition.chol.CholeskyOuterForm_DDRB;
24+
import org.ejml.dense.block.decomposition.chol.CholeskyOuterForm_MT_DDRB;
2425
import org.ejml.dense.row.RandomMatrices_DDRM;
2526
import org.ejml.interfaces.decomposition.CholeskyDecomposition_F64;
2627
import org.openjdk.jmh.annotations.*;
@@ -48,12 +49,14 @@ public class BenchmarkDecompositionCholesky_DDRB {
4849
public DMatrixRBlock A, A_template, L;
4950

5051
CholeskyDecomposition_F64<DMatrixRBlock> cholesky;
52+
CholeskyDecomposition_F64<DMatrixRBlock> choleskyMT;
5153

5254
@Setup
5355
public void setup() {
5456
Random rand = new Random(234);
5557

5658
cholesky = new CholeskyOuterForm_DDRB(lower);
59+
choleskyMT = new CholeskyOuterForm_MT_DDRB(lower);
5760
A = MatrixOps_DDRB.convert(RandomMatrices_DDRM.symmetricPosDef(size, rand));
5861
A_template = A.copy();
5962
L = new DMatrixRBlock(1, 1);
@@ -64,13 +67,18 @@ public void reset() {
6467
A.setTo(A_template);
6568
}
6669

67-
@Benchmark
68-
public void decompose() {
70+
@Benchmark public void outer() {
6971
if (!cholesky.decompose(A))
7072
throw new RuntimeException("FAILED?!");
7173
cholesky.getT(L);
7274
}
7375

76+
@Benchmark public void outer_MT() {
77+
if (!choleskyMT.decompose(A))
78+
throw new RuntimeException("FAILED?!");
79+
choleskyMT.getT(L);
80+
}
81+
7482
public static void main( String[] args ) throws RunnerException {
7583
Options opt = new OptionsBuilder()
7684
.include(BenchmarkDecompositionCholesky_DDRB.class.getSimpleName())

main/ejml-ddense/benchmarks/src/org/ejml/dense/block/decompose/chol/BenchmarkDecompositionCholesky_MT_DDRB.java

Lines changed: 0 additions & 78 deletions
This file was deleted.

main/ejml-ddense/benchmarks/src/org/ejml/dense/block/decompose/hessenberg/BenchmarkDecompositionHessenberg_DDRB.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.ejml.data.DMatrixRBlock;
2222
import org.ejml.dense.block.MatrixOps_DDRB;
2323
import org.ejml.dense.block.decomposition.hessenberg.TridiagonalDecompositionHouseholder_DDRB;
24+
import org.ejml.dense.block.decomposition.hessenberg.TridiagonalDecompositionHouseholder_MT_DDRB;
2425
import org.ejml.dense.row.RandomMatrices_DDRM;
2526
import org.openjdk.jmh.annotations.*;
2627
import org.openjdk.jmh.runner.Runner;
@@ -39,27 +40,42 @@
3940
@Fork(value = 1)
4041
public class BenchmarkDecompositionHessenberg_DDRB {
4142
// @Param({"100", "500", "1000", "5000", "10000"})
42-
@Param({"2000"})
43+
@Param({"500", "2000"})
4344
public int size;
4445

45-
public DMatrixRBlock S, S_template;
46+
public DMatrixRBlock S, S_template,Q, R;
4647

47-
TridiagonalDecompositionHouseholder_DDRB tridiagonal = new TridiagonalDecompositionHouseholder_DDRB();
48+
TridiagonalDecompositionHouseholder_DDRB house = new TridiagonalDecompositionHouseholder_DDRB();
49+
TridiagonalDecompositionHouseholder_MT_DDRB houseMT = new TridiagonalDecompositionHouseholder_MT_DDRB();
4850

4951
@Setup public void setup() {
5052
Random rand = new Random(234);
5153

5254
S = MatrixOps_DDRB.convert(RandomMatrices_DDRM.symmetric(size, -1, 1, rand));
5355
S_template = S.copy();
56+
Q = new DMatrixRBlock(1, 1);
57+
R = new DMatrixRBlock(1, 1);
5458
}
5559

5660
@Setup(Level.Invocation) public void reset() {
5761
S.setTo(S_template);
5862
}
5963

6064
@Benchmark public void tridiagonal() {
61-
if (!tridiagonal.decompose(S))
65+
if (!house.decompose(S))
6266
throw new RuntimeException("Decomposition failed?");
67+
// transposed and not exercise different paths
68+
house.getQ(Q, false);
69+
house.getQ(Q, true);
70+
house.getT(R);
71+
}
72+
73+
@Benchmark public void tridiagonal_MT() {
74+
if (!houseMT.decompose(S))
75+
throw new RuntimeException("Decomposition failed?");
76+
houseMT.getQ(Q, false);
77+
houseMT.getQ(Q, true);
78+
houseMT.getT(R);
6379
}
6480

6581
public static void main( String[] args ) throws RunnerException {

main/ejml-ddense/benchmarks/src/org/ejml/dense/block/decompose/hessenberg/BenchmarkDecompositionHessenberg_MT_DDRB.java

Lines changed: 0 additions & 72 deletions
This file was deleted.

main/ejml-ddense/benchmarks/src/org/ejml/dense/block/decompose/qr/BenchmarkDecompositionQR_DDRB.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.ejml.data.DMatrixRBlock;
2222
import org.ejml.dense.block.MatrixOps_DDRB;
2323
import org.ejml.dense.block.decomposition.qr.QRDecompositionHouseholder_DDRB;
24+
import org.ejml.dense.block.decomposition.qr.QRDecompositionHouseholder_MT_DDRB;
2425
import org.ejml.interfaces.decomposition.QRDecomposition;
2526
import org.openjdk.jmh.annotations.*;
2627
import org.openjdk.jmh.runner.Runner;
@@ -42,25 +43,41 @@ public class BenchmarkDecompositionQR_DDRB {
4243
@Param({"1000", "2000"})
4344
public int size;
4445

45-
public DMatrixRBlock A, A_template;
46+
public DMatrixRBlock A, A_template, Q, R;
4647

47-
QRDecomposition<DMatrixRBlock> qr = new QRDecompositionHouseholder_DDRB();
48+
QRDecomposition<DMatrixRBlock> house = new QRDecompositionHouseholder_DDRB();
49+
QRDecomposition<DMatrixRBlock> houseMT = new QRDecompositionHouseholder_MT_DDRB();
4850

49-
@Setup
50-
public void setup() {
51+
@Setup public void setup() {
5152
Random rand = new Random(234);
5253

5354
A = MatrixOps_DDRB.createRandom(size*4, size/4, -1, 1, rand);
5455
A_template = A.copy();
56+
57+
Q = new DMatrixRBlock(1, 1);
58+
R = new DMatrixRBlock(1, 1);
5559
}
5660

5761
@Setup(Level.Invocation) public void reset() {
5862
A.setTo(A_template);
5963
}
6064

61-
@Benchmark public void decompose() {
62-
if (!qr.decompose(A))
65+
@Benchmark public void householder() {
66+
if (!house.decompose(A))
67+
throw new RuntimeException("FAILED?!");
68+
69+
// get Q and R to fully exercise the code. Compact format to avoid having Q dominate
70+
house.getQ(Q, true);
71+
house.getR(R, true);
72+
}
73+
74+
@Benchmark public void householder_MT() {
75+
if (!houseMT.decompose(A))
6376
throw new RuntimeException("FAILED?!");
77+
78+
// get Q and R to fully exercise the code. Compact format to avoid having Q dominate
79+
houseMT.getQ(Q, true);
80+
houseMT.getR(R, true);
6481
}
6582

6683
public static void main( String[] args ) throws RunnerException {

main/ejml-ddense/benchmarks/src/org/ejml/dense/block/decompose/qr/BenchmarkDecompositionQR_MT_DDRB.java

Lines changed: 0 additions & 72 deletions
This file was deleted.

main/ejml-ddense/src/org/ejml/dense/block/decomposition/hessenberg/TridiagonalDecompositionHouseholder_DDRB.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ public DMatrixRBlock getT( @Nullable DMatrixRBlock T ) {
6565
if (T == null) {
6666
T = new DMatrixRBlock(A.numRows, A.numCols, A.blockLength);
6767
} else {
68-
if (T.numRows != A.numRows || T.numCols != A.numCols)
69-
throw new IllegalArgumentException("T must have the same dimensions as the input matrix");
70-
68+
if (T.blockLength != A.blockLength)
69+
throw new RuntimeException("Block lengths don't match");
70+
T.reshape(A.numRows, A.numCols);
7171
CommonOps_DDRM.fill(T, 0);
7272
}
7373

0 commit comments

Comments
 (0)