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 2018/02/15 06:10:54 UTC
systemml git commit: [SYSTEMML-2148] Performance codegen cell ops
over compressed matrices
Repository: systemml
Updated Branches:
refs/heads/master ddaf166fb -> 868b4b98a
[SYSTEMML-2148] Performance codegen cell ops over compressed matrices
This patch makes a minor performance improvement to codegen cell
operations over compressed matrices, especially for multi-threaded
execution. Specifically, we now reuse in a thread-local manner the
allocated count arrays across column groups.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/868b4b98
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/868b4b98
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/868b4b98
Branch: refs/heads/master
Commit: 868b4b98a48d549b4f9670a590693c05613d14b3
Parents: ddaf166
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed Feb 14 21:48:53 2018 -0800
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Feb 14 22:10:45 2018 -0800
----------------------------------------------------------------------
.../apache/sysml/runtime/codegen/SpoofCellwise.java | 7 +++++--
.../apache/sysml/runtime/compress/ColGroupDDC1.java | 8 ++++----
.../apache/sysml/runtime/compress/ColGroupDDC2.java | 8 ++++----
.../apache/sysml/runtime/compress/ColGroupOLE.java | 8 ++++----
.../apache/sysml/runtime/compress/ColGroupRLE.java | 8 ++++----
.../apache/sysml/runtime/compress/ColGroupValue.java | 14 ++++++++++++--
6 files changed, 33 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/868b4b98/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java b/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
index 5080e6c..b7024ed 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
@@ -1082,10 +1082,13 @@ public abstract class SpoofCellwise extends SpoofOperator implements Serializabl
if( sparseSafe && b.length==0 && !a.hasUncompressedColGroup() ) {
//note: all remaining groups are guaranteed ColGroupValue
boolean entireGrp = (rl==0 && ru==a.getNumRows());
+ int maxNumVals = a.getColGroups().stream().mapToInt(
+ g -> ((ColGroupValue)g).getNumValues()).max().orElse(0);
+ int[] counts = new int[maxNumVals];
for( ColGroup grp : a.getColGroups() ) {
ColGroupValue grpv = (ColGroupValue) grp;
- int[] counts = entireGrp ?
- grpv.getCounts() : grpv.getCounts(rl, ru);
+ counts = entireGrp ? grpv.getCounts(counts) :
+ grpv.getCounts(rl, ru, counts);
for(int k=0; k<grpv.getNumValues(); k++) {
kbuff2.set(0, 0);
double in = grpv.sumValues(k, kplus, kbuff2);
http://git-wip-us.apache.org/repos/asf/systemml/blob/868b4b98/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 117a1d3..565aa8f 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
@@ -204,14 +204,14 @@ public class ColGroupDDC1 extends ColGroupDDC
}
@Override
- public int[] getCounts() {
- return getCounts(0, getNumRows());
+ public int[] getCounts(int[] counts) {
+ return getCounts(0, getNumRows(), counts);
}
@Override
- public int[] getCounts(int rl, int ru) {
+ public int[] getCounts(int rl, int ru, int[] counts) {
final int numVals = getNumValues();
- int[] counts = new int[numVals];
+ Arrays.fill(counts, 0, numVals, 0);
for( int i=rl; i<ru; i++ )
counts[_data[i]&0xFF] ++;
return counts;
http://git-wip-us.apache.org/repos/asf/systemml/blob/868b4b98/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 6303ff0..28e565c 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
@@ -193,14 +193,14 @@ public class ColGroupDDC2 extends ColGroupDDC
}
@Override
- public int[] getCounts() {
- return getCounts(0, getNumRows());
+ public int[] getCounts(int[] counts) {
+ return getCounts(0, getNumRows(), counts);
}
@Override
- public int[] getCounts(int rl, int ru) {
+ public int[] getCounts(int rl, int ru, int[] counts) {
final int numVals = getNumValues();
- int[] counts = new int[numVals];
+ Arrays.fill(counts, 0, numVals, 0);
for( int i=rl; i<ru; i++ )
counts[_data[i]] ++;
return counts;
http://git-wip-us.apache.org/repos/asf/systemml/blob/868b4b98/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 e466369..4561c14 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
@@ -229,9 +229,9 @@ public class ColGroupOLE extends ColGroupOffset
}
@Override
- public int[] getCounts() {
+ public int[] getCounts(int[] counts) {
final int numVals = getNumValues();
- int[] counts = new int[numVals];
+ Arrays.fill(counts, 0, numVals, 0);
for (int k = 0; k < numVals; k++) {
int boff = _ptr[k];
int blen = len(k);
@@ -245,10 +245,10 @@ public class ColGroupOLE extends ColGroupOffset
}
@Override
- public int[] getCounts(int rl, int ru) {
+ public int[] getCounts(int rl, int ru, int[] counts) {
final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ;
final int numVals = getNumValues();
- int[] counts = new int[numVals];
+ Arrays.fill(counts, 0, numVals, 0);
for (int k = 0; k < numVals; k++) {
int boff = _ptr[k];
int blen = len(k);
http://git-wip-us.apache.org/repos/asf/systemml/blob/868b4b98/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 876012f..cbdf4a5 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
@@ -225,9 +225,9 @@ public class ColGroupRLE extends ColGroupOffset
}
@Override
- public int[] getCounts() {
+ public int[] getCounts(int[] counts) {
final int numVals = getNumValues();
- int[] counts = new int[numVals];
+ Arrays.fill(counts, 0, numVals, 0);
for (int k = 0; k < numVals; k++) {
int boff = _ptr[k];
int blen = len(k);
@@ -244,9 +244,9 @@ public class ColGroupRLE extends ColGroupOffset
}
@Override
- public int[] getCounts(int rl, int ru) {
+ public int[] getCounts(int rl, int ru, int[] counts) {
final int numVals = getNumValues();
- int[] counts = new int[numVals];
+ Arrays.fill(counts, 0, numVals, 0);
for (int k = 0; k < numVals; k++) {
int boff = _ptr[k];
int blen = len(k);
http://git-wip-us.apache.org/repos/asf/systemml/blob/868b4b98/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 a416c5e..2e5dc78 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupValue.java
@@ -149,9 +149,19 @@ public abstract class ColGroupValue extends ColGroup
return ret;
}
- public abstract int[] getCounts();
+ public final int[] getCounts() {
+ int[] tmp = new int[getNumValues()];
+ return getCounts(tmp);
+ }
+
+ public abstract int[] getCounts(int[] out);
+
+ public final int[] getCounts(int rl, int ru) {
+ int[] tmp = new int[getNumValues()];
+ return getCounts(rl, ru, tmp);
+ }
- public abstract int[] getCounts(int rl, int ru);
+ public abstract int[] getCounts(int rl, int ru, int[] out);
public int[] getCounts(boolean inclZeros) {
int[] counts = getCounts();