Repository: ignite
Updated Branches:
  refs/heads/master 63a312518 -> 6efc4d9aa


IGNITE-7097: performance measurement for SparseDistributedMatrix multiplication

this closes #3241


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6efc4d9a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6efc4d9a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6efc4d9a

Branch: refs/heads/master
Commit: 6efc4d9aacb5ae71994b1bd4ac4bb4bc6765e5be
Parents: 63a3125
Author: Oleg Ignatenko <[email protected]>
Authored: Fri Dec 29 15:27:10 2017 +0300
Committer: Yury Babak <[email protected]>
Committed: Fri Dec 29 15:27:10 2017 +0300

----------------------------------------------------------------------
 .../impls/matrix/SparseDistributedMatrix.java   |  3 +
 .../yardstick/config/benchmark-ml.properties    |  2 +
 .../math/IgniteAbstractMatrixMulBenchmark.java  | 29 +++++---
 ...iteSparseDistributedMatrixMul2Benchmark.java | 74 ++++++++++++++++++++
 ...niteSparseDistributedMatrixMulBenchmark.java | 20 +++++-
 5 files changed, 117 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
----------------------------------------------------------------------
diff --git 
a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
 
b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
index 3288724..026138b 100644
--- 
a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
+++ 
b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
@@ -44,6 +44,9 @@ import 
org.apache.ignite.ml.math.impls.vector.SparseDistributedVector;
  * You also need to call {@link #destroy()} to remove the underlying cache 
when you no longer need this
  * matrix.</p>
  * <p>
+ * This class is not intended for fast calculations (for example, matrix 
multiplication). If better performance
+ * is needed, {@link SparseBlockDistributedMatrix} should be used instead.</p>
+ * <p>
  * <b>Currently fold supports only commutative operations.<b/></p>
  */
 public class SparseDistributedMatrix extends AbstractMatrix implements 
StorageConstants {

http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/config/benchmark-ml.properties
----------------------------------------------------------------------
diff --git a/modules/yardstick/config/benchmark-ml.properties 
b/modules/yardstick/config/benchmark-ml.properties
index 4867c0f..5992665 100644
--- a/modules/yardstick/config/benchmark-ml.properties
+++ b/modules/yardstick/config/benchmark-ml.properties
@@ -85,6 +85,8 @@ CONFIGS="\
 -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn 
IgniteDenseLocalOffHeapMatrixMulBenchmark -sn IgniteNode -ds 
${ver}dense-local-offheap-matrix-mul-${b}-backup,\
 -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn IgniteSparseLocalMatrixMulBenchmark 
-sn IgniteNode -ds ${ver}sparse-local-matrix-mul-${b}-backup,\
 -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn 
IgniteSparseBlockDistributedMatrixMulBenchmark -sn IgniteNode -ds 
${ver}sparse-block-distributed-matrix-mul-${b}-backup,\
+-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn 
IgniteSparseDistributedMatrixMulBenchmark -sn IgniteNode -ds 
${ver}sparse-distributed-matrix-mul-${b}-backup,\
+-cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn 
IgniteSparseDistributedMatrixMul2Benchmark -sn IgniteNode -ds 
${ver}sparse-distributed-matrix-mul2-${b}-backup,\
 -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn 
IgniteColumnDecisionTreeVarianceBenchmark -sn IgniteNode -ds 
${ver}column-decision-tree-variance-${b}-backup,\
 -cfg ${SCRIPT_DIR}/../config/ignite-localhost-config.xml -nn ${nodesNum} -b 
${b} -w ${w} -d ${d} -t ${t} -sm ${sm} -dn 
IgniteColumnDecisionTreeGiniBenchmark -sn IgniteNode -ds 
${ver}column-decision-tree-gini-${b}-backup,\
 "

http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java
----------------------------------------------------------------------
diff --git 
a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java
 
b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java
index 9921e36..6cb2200 100644
--- 
a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java
+++ 
b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteAbstractMatrixMulBenchmark.java
@@ -26,11 +26,11 @@ import org.apache.ignite.yardstick.IgniteAbstractBenchmark;
 import org.apache.ignite.yardstick.ml.DataChanger;
 
 /**
- * Ignite benchmark that performs ML Grid operations.
+ * Ignite benchmark that performs ML Grid operations of matrix multiplication.
  */
 abstract class IgniteAbstractMatrixMulBenchmark extends 
IgniteAbstractBenchmark {
     /** */
-    private static final int SIZE = 1 << 8;
+    private static final int SIZE = 1 << 7;
 
     /** */
     private double[][] dataSquare = createAndFill(SIZE, SIZE);
@@ -58,9 +58,9 @@ abstract class IgniteAbstractMatrixMulBenchmark extends 
IgniteAbstractBenchmark
             @Override public void run() {
                 Matrix m1, m2, m3, m4, m5, m6;
 
-                Matrix m7 = (m1 = createAndFill(dataSquare, scale)).times((m2 
= createAndFill(dataSquare, scale)));
-                Matrix m8 = (m3 = createAndFill(dataRect1, scale)).times((m4 = 
createAndFill(dataRect2, scale)));
-                Matrix m9 = (m5 = createAndFill(dataRect2, scale)).times((m6 = 
createAndFill(dataRect1, scale)));
+                Matrix m7 = times(m1 = createAndFill(dataSquare, scale), m2 = 
createAndFill(dataSquare, scale));
+                Matrix m8 = times(m3 = createAndFill(dataRect1, scale), m4 = 
createAndFill(dataRect2, scale));
+                Matrix m9 = times(m5 = createAndFill(dataRect2, scale), m6 = 
createAndFill(dataRect1, scale));
 
                 m1.destroy();
                 m2.destroy();
@@ -81,11 +81,24 @@ abstract class IgniteAbstractMatrixMulBenchmark extends 
IgniteAbstractBenchmark
         return true;
     }
 
-    /** Override in subclasses with specific type Matrix. */
+    /**
+     * Override in subclasses with specific type Matrix. Note that size of 
result matrix may be smaller than requested.
+     *
+     * @param rowSize Requested row size.
+     * @param colSize Requested column size.
+     * @return Matrix of desired type of size that doesn't exceed requested.
+     */
     abstract Matrix newMatrix(int rowSize, int colSize);
 
-    /** */
-    private Matrix createAndFill(double[][] data, double scale) {
+    /** Override in subclasses if needed. */
+    Matrix times(Matrix m1, Matrix m2) {
+        return m1.times(m2);
+    }
+
+    /** Override in subclasses if needed to account for smaller matrix size. */
+    Matrix createAndFill(double[][] data, double scale) {
+        // IMPL NOTE yardstick 0.8.3 fails to discover benchmark if we try to 
account for smaller size
+        //  matrix by using method with lambda parameter here: assign((row, 
col) -> data[row][col]).
         Matrix res = newMatrix(data.length, data[0].length).assign(data);
 
         for (int i = 0; i < data.length && i < data[0].length; i++)

http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java
----------------------------------------------------------------------
diff --git 
a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java
 
b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java
new file mode 100644
index 0000000..e1afc34
--- /dev/null
+++ 
b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMul2Benchmark.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.yardstick.ml.math;
+
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.matrix.SparseBlockDistributedMatrix;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix;
+
+/**
+ * Ignite benchmark that performs trivially optimized matrix multiplication of 
{@link SparseDistributedMatrix} that
+ * uses delegating to {@link SparseBlockDistributedMatrix}. For unoptimized 
benchmark refer
+ * {@link IgniteSparseDistributedMatrixMulBenchmark}.
+ */
+@SuppressWarnings("unused")
+public class IgniteSparseDistributedMatrixMul2Benchmark extends 
IgniteAbstractMatrixMulBenchmark {
+    /** {@inheritDoc} */
+    @Override Matrix newMatrix(int rowSize, int colSize) {
+        return new SparseDistributedMatrix(rowSize, colSize,
+            StorageConstants.ROW_STORAGE_MODE, 
StorageConstants.RANDOM_ACCESS_MODE);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Matrix times(Matrix m1, Matrix m2) {
+        return new OptimisedTimes(m1, m2).times();
+    }
+
+    /** */
+    private static class OptimisedTimes {
+        /** */
+        private final Matrix m1;
+
+        /** */
+        private final Matrix m2;
+
+        /** */
+        OptimisedTimes(Matrix m1, Matrix m2) {
+            this.m1 = m1;
+            this.m2 = m2;
+        }
+
+        /** */
+        Matrix times() {
+            Matrix m1Block = new SparseBlockDistributedMatrix(m1.rowSize(), 
m1.columnSize()).assign(m1);
+            Matrix m2Block = new SparseBlockDistributedMatrix(m2.rowSize(), 
m2.columnSize()).assign(m2);
+
+            Matrix m3Block = m1Block.times(m2Block);
+
+            Matrix res = new SparseDistributedMatrix(m3Block.rowSize(), 
m3Block.columnSize(),
+                StorageConstants.ROW_STORAGE_MODE, 
StorageConstants.RANDOM_ACCESS_MODE).assign(m3Block);
+
+            m1Block.destroy();
+            m2Block.destroy();
+            m3Block.destroy();
+
+            return res;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6efc4d9a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java
----------------------------------------------------------------------
diff --git 
a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java
 
b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java
index d02ce88..0f9d288 100644
--- 
a/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java
+++ 
b/modules/yardstick/src/main/ml/org/apache/ignite/yardstick/ml/math/IgniteSparseDistributedMatrixMulBenchmark.java
@@ -22,14 +22,28 @@ import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrix;
 
 /**
- * Ignite benchmark that performs ML Grid operations.
- * Todo: IGNITE-7097, complete implementation of this benchmark.
+ * Ignite benchmark that performs unoptimized matrix multiplication of {@link 
SparseDistributedMatrix}.
+ * For optimized benchmark refer {@link 
IgniteSparseBlockDistributedMatrixMulBenchmark}.
  */
 @SuppressWarnings("unused")
 public class IgniteSparseDistributedMatrixMulBenchmark extends 
IgniteAbstractMatrixMulBenchmark {
+    /** This benchmark is unacceptably slow without scaling down, see 
IGNITE-7097. */
+    private static final int SCALE_DOWN = 2;
+
     /** {@inheritDoc} */
     @Override Matrix newMatrix(int rowSize, int colSize) {
-        return new SparseDistributedMatrix(rowSize, colSize,
+        return new SparseDistributedMatrix(rowSize >> SCALE_DOWN, colSize >> 
SCALE_DOWN,
             StorageConstants.ROW_STORAGE_MODE, 
StorageConstants.RANDOM_ACCESS_MODE);
     }
+
+    /** {@inheritDoc} */
+    @Override Matrix createAndFill(double[][] data, double scale) {
+        Matrix res = newMatrix(data.length, data[0].length);
+
+        for (int row = 0; row < res.rowSize(); row++)
+            for (int col = 0; col < res.columnSize(); col++)
+                res.set(row, col, row == col ? data[row][col] * scale : 
data[row][col]);
+
+        return res;
+    }
 }

Reply via email to