diff --git a/src/main/java/org/apache/sysds/runtime/transform/encode/ColumnEncoder.java b/src/main/java/org/apache/sysds/runtime/transform/encode/ColumnEncoder.java index d82d0a9b443..f69da6f6457 100644 --- a/src/main/java/org/apache/sysds/runtime/transform/encode/ColumnEncoder.java +++ b/src/main/java/org/apache/sysds/runtime/transform/encode/ColumnEncoder.java @@ -119,13 +119,29 @@ public MatrixBlock apply(CacheBlock in, MatrixBlock out, int outputCol, int rowS protected abstract double[] getCodeCol(CacheBlock in, int startInd, int blkSize); - protected void applySparse(CacheBlock in, MatrixBlock out, int outputCol, int rowStart, int blk){ + /*protected void applySparse(CacheBlock in, MatrixBlock out, int outputCol, int rowStart, int blk){ int index = _colID - 1; for(int r = rowStart; r < getEndIndex(in.getNumRows(), rowStart, blk); r++) { SparseRowVector row = (SparseRowVector) out.getSparseBlock().get(r); row.values()[index] = getCode(in, r); row.indexes()[index] = outputCol; } + }*/ + + protected void applySparse(CacheBlock in, MatrixBlock out, int outputCol, int rowStart, int blk){ + int index = _colID - 1; + // Apply loop tiling to exploit CPU caches + double[] codes = getCodeCol(in, rowStart, blk); + int rowEnd = getEndIndex(in.getNumRows(), rowStart, blk); + int B = 32; //tile size + for(int i = rowStart; i < rowEnd; i+=B) { + int lim = Math.min(i+B, rowEnd); + for (int ii=i; ii sparseRowsWZeros = null; int index = _colID - 1; - for(int r = rowStart; r < getEndIndex(in.getNumRows(), rowStart, blk); r++) { - double v = getCode(in, r); - SparseRowVector row = (SparseRowVector) out.getSparseBlock().get(r); - if(v == 0) { - if(sparseRowsWZeros == null) - sparseRowsWZeros = new HashSet<>(); - sparseRowsWZeros.add(r); + // Apply loop tiling to exploit CPU caches + double[] codes = getCodeCol(in, rowStart, blk); + int rowEnd = getEndIndex(in.getNumRows(), rowStart, blk); + int B = 32; //tile size + for(int i = rowStart; i < rowEnd; i+=B) { + int lim = Math.min(i+B, rowEnd); + for (int ii=i; ii(); + sparseRowsWZeros.add(ii); + } + row.values()[index] = v; + row.indexes()[index] = outputCol; } - row.values()[index] = v; - row.indexes()[index] = outputCol; } if(sparseRowsWZeros != null){ addSparseRowsWZeros(sparseRowsWZeros);