This is an automated email from the ASF dual-hosted git repository.
baunsgaard pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemds.git
The following commit(s) were added to refs/heads/master by this push:
new ae6019a [MINOR] CLA small specialization in SDCZeros
ae6019a is described below
commit ae6019ad987e2e499ec922b0a4fd3628dfc59621
Author: baunsgaard <[email protected]>
AuthorDate: Fri Aug 27 22:26:47 2021 +0200
[MINOR] CLA small specialization in SDCZeros
This commit adds a few dedicated methods for different mapping types
to SDCZeros colgroup when pre-aggregating from dense left hand side,
This gives a few percent better performance in some cases
(that might be noise)
---
.../compress/colgroup/ColGroupSDCZeros.java | 64 ++++++++++++++++++++--
1 file changed, 58 insertions(+), 6 deletions(-)
diff --git
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCZeros.java
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCZeros.java
index ab6f753..030cf83 100644
---
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCZeros.java
+++
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCZeros.java
@@ -28,6 +28,8 @@ import org.apache.commons.lang.NotImplementedException;
import org.apache.sysds.runtime.compress.colgroup.dictionary.ADictionary;
import org.apache.sysds.runtime.compress.colgroup.dictionary.Dictionary;
import org.apache.sysds.runtime.compress.colgroup.mapping.AMapToData;
+import org.apache.sysds.runtime.compress.colgroup.mapping.MapToByte;
+import org.apache.sysds.runtime.compress.colgroup.mapping.MapToChar;
import org.apache.sysds.runtime.compress.colgroup.mapping.MapToFactory;
import org.apache.sysds.runtime.compress.colgroup.offset.AIterator;
import org.apache.sysds.runtime.compress.colgroup.offset.AOffset;
@@ -241,18 +243,68 @@ public class ColGroupSDCZeros extends ColGroupValue {
final double[] preAV = preAgg.getDenseBlockValues();
final int numVals = getNumValues();
- final AIterator itStart = _indexes.getIterator(cl);
+ if(_data instanceof MapToByte) {
+ preAggregateDenseByte(m, preAV, ((MapToByte)
_data).getBytes(), rl, ru, cl, cu, _numRows, numVals,
+ _indexes);
+ }
+ else if(_data instanceof MapToChar) {
+ preAggregateDenseChar(m, preAV, ((MapToChar)
_data).getChars(), rl, ru, cl, cu, _numRows, numVals,
+ _indexes);
+ }
+ else {
+ // multi row iterator.
+ final AIterator itStart = _indexes.getIterator(cl);
+ AIterator it = null;
+ for(int rowLeft = rl, offOut = 0; rowLeft < ru;
rowLeft++, offOut += numVals) {
+ final int offLeft = rowLeft * _numRows;
+ it = itStart.clone();
+ while(it.value() < cu && it.hasNext()) {
+ final int i = it.value();
+ preAV[offOut +
getIndex(it.getDataIndexAndIncrement())] += mV[offLeft + i];
+ }
+ }
+ if(it != null && cu < m.getNumColumns())
+ _indexes.cacheIterator(it, cu);
+ }
+ }
+
+ private static void preAggregateDenseByte(final MatrixBlock m, final
double[] preAV, final byte[] d, final int rl,
+ final int ru, final int cl, final int cu, final int nRow, final
int nVal, AOffset indexes) {
+ final double[] mV = m.getDenseBlockValues();
+ // multi row iterator.
+ final AIterator itStart = indexes.getIterator(cl);
AIterator it = null;
- for(int rowLeft = rl, offOut = 0; rowLeft < ru; rowLeft++,
offOut += numVals) {
- final int offLeft = rowLeft * _numRows;
+ for(int rowLeft = rl, offOut = 0; rowLeft < ru; rowLeft++,
offOut += preAV.length) {
+ final int offLeft = rowLeft * nRow;
it = itStart.clone();
while(it.value() < cu && it.hasNext()) {
- final int i = it.value();
- preAV[offOut +
getIndex(it.getDataIndexAndIncrement())] += mV[offLeft + i];
+ int i = it.value();
+ int index = d[it.getDataIndexAndIncrement()] &
0xFF;
+ preAV[offOut + index] += mV[offLeft + i];
}
}
if(it != null && cu < m.getNumColumns())
- _indexes.cacheIterator(it, cu);
+ indexes.cacheIterator(it, cu);
+ }
+
+ private static void preAggregateDenseChar(final MatrixBlock m, final
double[] preAV, final char[] d, final int rl,
+ final int ru, final int cl, final int cu, final int nRow, final
int nVal, AOffset indexes) {
+ final double[] mV = m.getDenseBlockValues();
+ // multi row iterator.
+ final AIterator itStart = indexes.getIterator(cl);
+ AIterator it = null;
+ for(int rowLeft = rl, offOut = 0; rowLeft < ru; rowLeft++,
offOut += preAV.length) {
+ final int offLeft = rowLeft * nRow;
+ it = itStart.clone();
+ while(it.value() < cu && it.hasNext()) {
+ int i = it.value();
+ int index = d[it.getDataIndexAndIncrement()];
+ preAV[offOut + index] += mV[offLeft + i];
+ }
+ }
+ if(it != null && cu < m.getNumColumns())
+ indexes.cacheIterator(it, cu);
+
}
private void preAggregateDenseOld(MatrixBlock m, MatrixBlock preAgg,
int rl, int ru) {