You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2017/04/17 05:17:26 UTC

incubator-systemml git commit: [SYSTEMML-1531] Performance compressed rowsums (ddc1 groups, alloc)

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 <mb...@gmail.com>
Authored: Sun Apr 16 22:15:56 2017 -0700
Committer: Matthias Boehm <mb...@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);