This is an automated email from the ASF dual-hosted git repository.

baunsgaard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new a06ea0f37c [SYSTEMDS-3832] MatrixBlock Append performance
a06ea0f37c is described below

commit a06ea0f37c01c47ca4251c6f95f7b49ffe05454e
Author: Sebastian Baunsgaard <[email protected]>
AuthorDate: Fri Feb 7 17:50:00 2025 +0100

    [SYSTEMDS-3832] MatrixBlock Append performance
    
    This commit contains a new performance measuring script for appending 
matrices.
    See the PR for performance details
    
    Closes #2223
---
 .../java/org/apache/sysds/performance/Main.java    |  4 +
 .../java/org/apache/sysds/performance/README.md    |  7 ++
 .../org/apache/sysds/performance/TimingUtils.java  | 88 +++++++++++++---------
 .../sysds/performance/compression/APerfTest.java   | 25 ++++--
 .../sysds/performance/matrix/MatrixAppend.java     | 86 +++++++++++++++++++++
 src/test/scripts/performance/append.sh             | 43 +++++++++++
 6 files changed, 210 insertions(+), 43 deletions(-)

diff --git a/src/test/java/org/apache/sysds/performance/Main.java 
b/src/test/java/org/apache/sysds/performance/Main.java
index d7f85c9b78..fc749b56df 100644
--- a/src/test/java/org/apache/sysds/performance/Main.java
+++ b/src/test/java/org/apache/sysds/performance/Main.java
@@ -31,6 +31,7 @@ import 
org.apache.sysds.performance.generators.FrameTransformFile;
 import org.apache.sysds.performance.generators.GenMatrices;
 import org.apache.sysds.performance.generators.IGenerate;
 import org.apache.sysds.performance.generators.MatrixFile;
+import org.apache.sysds.performance.matrix.MatrixAppend;
 import org.apache.sysds.performance.matrix.MatrixBinaryCellPerf;
 import org.apache.sysds.performance.matrix.MatrixMulPerformance;
 import org.apache.sysds.performance.matrix.MatrixReplacePerf;
@@ -135,6 +136,9 @@ public class Main {
                        case 1007:
                                Transform.main(args);
                                break;
+                       case 1008:
+                               MatrixAppend.main(args);
+                               break;
                        default:
                                break;
                }
diff --git a/src/test/java/org/apache/sysds/performance/README.md 
b/src/test/java/org/apache/sysds/performance/README.md
index 20d2757c80..4945afd9ab 100644
--- a/src/test/java/org/apache/sysds/performance/README.md
+++ b/src/test/java/org/apache/sysds/performance/README.md
@@ -89,3 +89,10 @@ transform encode
 ```bash
 java -jar 
-agentpath:$HOME/Programs/profiler/lib/libasyncProfiler.so=start,event=cpu,file=temp/log.html
 -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1007
 ```
+
+
+append matrix sequence 
+
+```bash
+./src/test/scripts/performance/append.sh
+```
diff --git a/src/test/java/org/apache/sysds/performance/TimingUtils.java 
b/src/test/java/org/apache/sysds/performance/TimingUtils.java
index 506d49cc86..e1933438f5 100644
--- a/src/test/java/org/apache/sysds/performance/TimingUtils.java
+++ b/src/test/java/org/apache/sysds/performance/TimingUtils.java
@@ -32,51 +32,26 @@ public interface TimingUtils {
 
        /** A specification enum for the type of statistics to gather from the 
time measurements */
        public enum StatsType {
-               MEAN_STD;
+               MEAN_STD, MEAN_STD_Q1;
        }
 
        /** The specified measurement to use in this case. Can be set from any 
of the programs */
-       public static StatsType st = StatsType.MEAN_STD;
-
-       // /**
-       // * Time the given function call
-       // *
-       // * @param f The function to execute
-       // * @return The time it took
-       // */
-       // public static double time(F f) {
-       // Timing time = new Timing(true);
-       // f.run();
-       // return time.stop();
-       // }
-
-       // /**
-       // * Time the function and print using the string given prepended.
-       // *
-       // * @param f The function to time
-       // * @param p The print statement
-       // */
-       // public static void time(F f, String p) {
-       // Timing time = new Timing(true);
-       // f.run();
-       // System.out.print(p);
-       // System.out.println(time.stop());
-       // }
+       // public static StatsType st = StatsType.MEAN_STD;
 
-/**
+       /**
         * Time the function given assuming that it should put result into the 
given time array at index i.
         * 
-        * @param f     The function to time
+        * @param f   The function to time
         * @param rep the number of repetitions
         */
        public static double[] time(F f, int rep) {
                double[] times = new double[rep];
-               for(int i = 0; i < rep; i ++)
+               for(int i = 0; i < rep; i++)
                        time(f, times, i);
-               
+
                return times;
        }
-       
+
        /**
         * Time the function given assuming that it should put result into the 
given time array at index i.
         * 
@@ -116,14 +91,31 @@ public interface TimingUtils {
        }
 
        /**
-        * Calculate the statistics of the times executed The default is to 
calculate the mean and standard deviation and
-        * return that as a string
+        * Calculate the statistics of the times executed
+        * <p>
+        * The default is to calculate the mean and standard deviation and 
return that as a string
         * 
-        * @param v The times observed
+        * @param v  The times observed
+        * @param st The type of stats to print
         * @return The status string.
         */
        public static String stats(double[] v) {
+               return statsMeanSTD(v);
+       }
+
+       /**
+        * Calculate the statistics of the times executed, given the stats type 
provided
+        * <p>
+        * The default is to calculate the mean and standard deviation and 
return that as a string
+        * 
+        * @param v  The times observed
+        * @param st The type of stats to print
+        * @return The status string.
+        */
+       public static String stats(double[] v, StatsType st) {
                switch(st) {
+                       case MEAN_STD_Q1:
+                               return statsMeanSTDQ1(v);
                        case MEAN_STD:
                        default:
                                return statsMeanSTD(v);
@@ -151,6 +143,32 @@ public interface TimingUtils {
                return String.format("%8.3f+-%7.3f ms", mean, std);
        }
 
+       private static String statsMeanSTDQ1(double[] v) {
+               final int l = v.length;
+               final int remove = (int) Math.floor(l * 0.05);
+               Arrays.sort(v);
+
+               double q1 = v[v.length - 1 - (int) (Math.floor((double) 
v.length / 100))];
+               double q2p5 = v[v.length - 1 - (int) (Math.floor((double) 
v.length / 40))];
+               double q5 = v[v.length - 1 - (int) (Math.floor((double) 
v.length / 20))];
+               double q10 = v[v.length - 1 - (int) (Math.floor((double) 
v.length / 10))];
+
+               double total = 0;
+               final int el = v.length - remove * 2;
+               for(int i = remove; i < l - remove; i++)
+                       total += v[i];
+
+               double mean = total / el;
+
+               double var = 0;
+               for(int i = remove; i < l - remove; i++)
+                       var += Math.pow(Math.abs(v[i] - mean), 2);
+
+               double std = Math.sqrt(var / el);
+
+               return String.format("%8.3f+-%7.3f ms [q1:%7.3f, q2.5:%7.3f, 
q5:%7.3f, q10:%7.3f]", mean, std, q1, q2p5, q5, q10);
+       }
+
        /**
         * Interface method to enable timed calling from other Classes
         */
diff --git 
a/src/test/java/org/apache/sysds/performance/compression/APerfTest.java 
b/src/test/java/org/apache/sysds/performance/compression/APerfTest.java
index 2c49393384..0ac88233f5 100644
--- a/src/test/java/org/apache/sysds/performance/compression/APerfTest.java
+++ b/src/test/java/org/apache/sysds/performance/compression/APerfTest.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 
 import org.apache.sysds.performance.TimingUtils;
 import org.apache.sysds.performance.TimingUtils.F;
+import org.apache.sysds.performance.TimingUtils.StatsType;
 import org.apache.sysds.performance.generators.IGenerate;
 
 public abstract class APerfTest<T, G> {
@@ -39,19 +40,27 @@ public abstract class APerfTest<T, G> {
        /** Warmup iterations */
        protected final int W;
 
+       /** The type of statistics to use */
+       protected final StatsType st;
+
        protected APerfTest(int N, IGenerate<G> gen) {
-               ret = new ArrayList<>(N);
-               this.gen = gen;
-               this.N = N;
-               this.W = 10;
+               this(N, 10, gen, StatsType.MEAN_STD);
        }
 
+       protected APerfTest(int N, IGenerate<G> gen, StatsType st) {
+               this(N, 10, gen, st);
+       }
 
        protected APerfTest(int N, int W, IGenerate<G> gen) {
+               this(N, W, gen, StatsType.MEAN_STD);
+       }
+
+       protected APerfTest(int N, int W, IGenerate<G> gen, StatsType st) {
                ret = new ArrayList<>(N);
                this.gen = gen;
                this.N = N;
-               this.W = 10;
+               this.W = W;
+               this.st = st;
        }
 
        protected void execute(F f, String name) throws InterruptedException {
@@ -70,7 +79,7 @@ public abstract class APerfTest<T, G> {
                ret.clear();
                double[] times = TimingUtils.time(f, c, b, N, gen);
                String retS = makeResString(times);
-               System.out.println(String.format("%35s, %s, %10s", name, 
TimingUtils.stats(times), retS));
+               System.out.println(String.format("%35s, %s, %10s", name, 
TimingUtils.stats(times, st), retS));
        }
 
        protected void warmup(F f, int n) throws InterruptedException {
@@ -92,7 +101,7 @@ public abstract class APerfTest<T, G> {
                ret.clear();
                double[] times = TimingUtils.time(f, c, b, N, gen);
                String retS = makeResString(times);
-               System.out.println(String.format("%35s, %s, %10s", name, 
TimingUtils.stats(times), retS));
+               System.out.println(String.format("%35s, %s, %10s", name, 
TimingUtils.stats(times, st), retS));
        }
 
        protected abstract String makeResString();
@@ -106,7 +115,7 @@ public abstract class APerfTest<T, G> {
                StringBuilder sb = new StringBuilder();
                sb.append(String.format("%20s ", 
this.getClass().getSimpleName()));
                sb.append(" Repetitions: ").append(N).append("\n");
-               sb.append(String.format("%20s ","Generator:"));
+               sb.append(String.format("%20s ", "Generator:"));
                sb.append(gen);
                sb.append("\n");
                return sb.toString();
diff --git 
a/src/test/java/org/apache/sysds/performance/matrix/MatrixAppend.java 
b/src/test/java/org/apache/sysds/performance/matrix/MatrixAppend.java
new file mode 100644
index 0000000000..75554bb830
--- /dev/null
+++ b/src/test/java/org/apache/sysds/performance/matrix/MatrixAppend.java
@@ -0,0 +1,86 @@
+/*
+ * 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.sysds.performance.matrix;
+
+import org.apache.sysds.performance.TimingUtils.StatsType;
+import org.apache.sysds.performance.compression.APerfTest;
+import org.apache.sysds.performance.generators.ConstMatrix;
+import org.apache.sysds.performance.generators.GenMatrices;
+import org.apache.sysds.performance.generators.IGenerate;
+import org.apache.sysds.runtime.matrix.data.MatrixBlock;
+
+public class MatrixAppend extends APerfTest<Object, MatrixBlock> {
+
+       final boolean cbind;
+
+       final MatrixBlock base;
+       final MatrixBlock[] others;
+       final int n;
+
+       public MatrixAppend(int N, int n, IGenerate<MatrixBlock> gen, boolean 
cbind) {
+               super(N, 0, new ConstMatrix(gen.take()), StatsType.MEAN_STD_Q1);
+               this.cbind = cbind;
+               this.n = n;
+               base = gen.take();
+
+               others = new MatrixBlock[n];
+               for(int i = 0; i < n; i++) {
+                       others[i] = gen.take();
+               }
+
+       }
+
+       public void run() throws Exception {
+
+               execute(() -> append(base, others), //
+                       String.format("appending:  rows:%5d cols:%5d sp:%3.1f  
Blocks:%4d  rep:%6d  ", //
+                               base.getNumRows(), base.getNumColumns(), 
base.getSparsity(), n, N));
+
+       }
+
+       private void append(MatrixBlock a, MatrixBlock[] others) {
+               a.append(others, null, cbind);
+       }
+
+       @Override
+       protected String makeResString() {
+               return "";
+       }
+
+       public static void main(String[] args) throws Exception {
+               IGenerate<MatrixBlock> in;
+               int nBlocks;
+               int nRepeats;
+               if(args.length == 0) {
+                       in = new GenMatrices(1000, 10, 10, 1.0);
+                       nBlocks = 10;
+                       nRepeats = 100;
+               }
+               else {
+                       in = new GenMatrices(Integer.parseInt(args[1]), 
Integer.parseInt(args[2]), 10, Double.parseDouble(args[3]));
+                       nBlocks = Integer.parseInt(args[4]);
+                       nRepeats = Integer.parseInt(args[5]);
+               }
+               in.generate(nBlocks + 2);
+
+               new MatrixAppend(nRepeats, nBlocks, in, false).run();
+       }
+
+}
diff --git a/src/test/scripts/performance/append.sh 
b/src/test/scripts/performance/append.sh
new file mode 100755
index 0000000000..d2184dd472
--- /dev/null
+++ b/src/test/scripts/performance/append.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env bash
+#-------------------------------------------------------------
+#
+# 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.
+#
+#-------------------------------------------------------------
+
+mvn package > /dev/null
+java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008  100  100 
1.0 1 30000
+java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000  100 
1.0 1 3000
+java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000 1000 
1.0 1 3000
+java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008  100  100 
0.3 1 30000
+java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000  100 
0.3 1 3000
+java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000 1000 
0.3 1 3000
+
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008  100  
100 1.0 10 30000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000  
100 1.0 10 3000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000 
1000 1.0 10 1000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008  100  
100 0.3 10 30000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000  
100 0.3 10 3000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000 
1000 0.3 10 1000
+
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008  100  
100 1.0 100 3000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000  
100 1.0 100 300
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000 
1000 1.0 100 200
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008  100  
100 0.3 100 3000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000  
100 0.3 100 2000
+# java -jar -XX:+UseNUMA target/systemds-3.3.0-SNAPSHOT-perf.jar 1008 1000 
1000 0.3 100 1000
\ No newline at end of file

Reply via email to