Repository: incubator-systemml
Updated Branches:
  refs/heads/master e1ae4a9f9 -> cd49f224a


[SYSTEMML-1531] Performance compressed rowsums (ddc1 groups, alloc)

Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/cd49f224
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/cd49f224
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/cd49f224

Branch: refs/heads/master
Commit: cd49f224a02f4d0f03c3b03e36bb8c5cba7edc27
Parents: e1ae4a9
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Sun Apr 16 22:15:56 2017 -0700
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Sun Apr 16 22:15:56 2017 -0700

----------------------------------------------------------------------
 .../sysml/runtime/compress/ColGroupDDC1.java    | 28 +++++++++++++-------
 .../sysml/runtime/compress/ColGroupDDC2.java    |  2 +-
 .../sysml/runtime/compress/ColGroupOLE.java     |  2 +-
 .../sysml/runtime/compress/ColGroupRLE.java     |  2 +-
 .../sysml/runtime/compress/ColGroupValue.java   |  7 ++++-
 5 files changed, 28 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/cd49f224/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
index 1ff07ac..c9e5c9d 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
@@ -302,7 +302,7 @@ public class ColGroupDDC1 extends ColGroupDDC
                double[] c = result.getDenseBlock();
                
                //pre-aggregate nnz per value tuple
-               double[] vals = sumAllValues(kplus, kbuff);
+               double[] vals = sumAllValues(kplus, kbuff, false);
                
                //scan data and add to result (use kahan plus not general 
KahanFunction
                //for correctness in case of sqk+)
@@ -332,14 +332,24 @@ public class ColGroupDDC1 extends ColGroupDDC
                //iterative over codes of all groups and add to output
                //(use kahan plus not general KahanFunction for correctness in 
case of sqk+)
                int blksz = 1024; //16KB
-               for( int bi=rl; bi<ru; bi+=blksz )
-                       for( int j=0; j<grps.length; j++ )
-                               for( int i=bi; i<Math.min(bi+blksz, ru); i++ ) 
{ 
-                                       kbuff.set(c[2*i], c[2*i+1]);
-                                       kplus2.execute2(kbuff, 
vals[j][grps[j]._data[i]&0xFF]);
-                                       c[2*i] = kbuff._sum;
-                                       c[2*i+1] = kbuff._correction;
-                               }
+               double[] tmpAgg = new double[blksz];
+               for( int bi=rl; bi<ru; bi+=blksz ) {
+                       Arrays.fill(tmpAgg, 0);
+                       //aggregate all groups 
+                       for( int j=0; j<grps.length; j++ ) {
+                               double[] valsj = vals[j];
+                               byte[] dataj = grps[j]._data;
+                               for( int i=bi; i<Math.min(bi+blksz, ru); i++ )
+                                       tmpAgg[i-bi] += valsj[dataj[i]&0xFF];
+                       }
+                       //add partial results of all ddc groups
+                       for( int i=bi; i<Math.min(bi+blksz, ru); i++ ) {
+                               kbuff.set(c[2*i], c[2*i+1]);
+                               kplus2.execute2(kbuff, tmpAgg[i-bi]);
+                               c[2*i] = kbuff._sum;
+                               c[2*i+1] = kbuff._correction;
+                       }       
+               }
        }
        
        @Override

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/cd49f224/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
index b4de6c3..2584a47 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
@@ -301,7 +301,7 @@ public class ColGroupDDC2 extends ColGroupDDC
                double[] c = result.getDenseBlock();
                
                //pre-aggregate nnz per value tuple
-               double[] vals = sumAllValues(kplus, kbuff);
+               double[] vals = sumAllValues(kplus, kbuff, false);
                
                //scan data and add to result (use kahan plus not general 
KahanFunction
                //for correctness in case of sqk+)

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/cd49f224/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
index bc1d421..b4b9169 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
@@ -472,7 +472,7 @@ public class ColGroupOLE extends ColGroupOffset
                        
                        //step 1: prepare position and value arrays
                        int[] apos = skipScan(numVals, rl);
-                       double[] aval = sumAllValues(kplus, kbuff);
+                       double[] aval = sumAllValues(kplus, kbuff, false);
                                        
                        //step 2: cache conscious row sums via horizontal scans 
                        for( int bi=rl; bi<ru; bi+=blksz2 ) 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/cd49f224/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
index 0e50262..b9fe5d3 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
@@ -482,7 +482,7 @@ public class ColGroupRLE extends ColGroupOffset
                        //current pos / values per RLE list
                        int[] astart = new int[numVals];
                        int[] apos = skipScan(numVals, rl, astart);
-                       double[] aval = sumAllValues(kplus, kbuff);
+                       double[] aval = sumAllValues(kplus, kbuff, false);
                        
                        //step 2: cache conscious matrix-vector via horizontal 
scans 
                        for( int bi=rl; bi<ru; bi+=blksz ) 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/cd49f224/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java
index d8870a4..a374137 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java
@@ -164,13 +164,18 @@ public abstract class ColGroupValue extends ColGroup
        }
        
        protected final double[] sumAllValues(KahanFunction kplus, KahanObject 
kbuff) {
+               return sumAllValues(kplus, kbuff, true);
+       }
+       
+       protected final double[] sumAllValues(KahanFunction kplus, KahanObject 
kbuff, boolean allocNew) {
                //quick path: sum 
                if( getNumCols()==1 && kplus instanceof KahanPlus )
                        return _values; //shallow copy of values
                
                //pre-aggregate value tuple 
                final int numVals = getNumValues();
-               double[] ret = new double[numVals];
+               double[] ret = allocNew ? new double[numVals] :
+                       allocDVector(numVals, false);
                for( int k=0; k<numVals; k++ )
                        ret[k] = sumValues(k, kplus, kbuff);
                

Reply via email to