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);