Repository: systemml
Updated Branches:
  refs/heads/master 0505fd38c -> d9c09e771


[SYSTEMML-1947] Performance cp read sparse binary matrices (seq, par)

A previous performance improvement for reading ultra-sparse binary block
matrices (SYSTEMML-1838) changed the block format of temporary reuse
blocks from MCSR to CSR. For specific scenarios of sparse matrices with
a number of columns lower or equal the blocksize, this caused a fallback
from efficient row copies to the default path of value appends. This was
problematic because it leads to repeated reallocations in the presence
of skew that are unnecessary for matrices with a single column block. 

This patch improves this codepath for all sparse block formats,
including the currently used CSR blocks. By leveraging efficient row
copies without redundant deep copy or reallocations, this modification
significantly reduces GC overhead.

On a scenario of reading the Mnist8m dataset (19GB, sp=0.25) from HDFS,
this patch improved performance from 30.1s (19s GC) to 20.3s (11s GC).


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/d9c09e77
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/d9c09e77
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/d9c09e77

Branch: refs/heads/master
Commit: d9c09e77196516c17c80813c7ed60378a1515f51
Parents: 0505fd3
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Sun Oct 8 20:16:55 2017 -0700
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Sun Oct 8 20:17:10 2017 -0700

----------------------------------------------------------------------
 .../sysml/runtime/io/ReaderBinaryBlock.java     |  2 +-
 .../runtime/io/ReaderBinaryBlockParallel.java   | 20 ++++++++++----------
 .../sysml/runtime/matrix/data/MatrixBlock.java  | 11 +++++++----
 3 files changed, 18 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/d9c09e77/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlock.java 
b/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlock.java
index e0c217a..5b5b8ca 100644
--- a/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlock.java
@@ -110,7 +110,7 @@ public class ReaderBinaryBlock extends MatrixReader
                MatrixBlock value = new MatrixBlock(brlen, bclen, sparse);
                if( sparse ) {
                        value.allocateAndResetSparseRowsBlock(true, 
SparseBlock.Type.CSR);
-                       value.getSparseBlock().allocate(0, 1024);
+                       value.getSparseBlock().allocate(0, brlen*bclen);
                }
                return value;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/d9c09e77/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlockParallel.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlockParallel.java 
b/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlockParallel.java
index 16260a8..374e795 100644
--- a/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlockParallel.java
+++ b/src/main/java/org/apache/sysml/runtime/io/ReaderBinaryBlockParallel.java
@@ -62,10 +62,10 @@ public class ReaderBinaryBlockParallel extends 
ReaderBinaryBlock
                JobConf job = new 
JobConf(ConfigurationManager.getCachedJobConf());     
                Path path = new Path( (_localFS ? "file:///" : "") + fname); 
                FileSystem fs = IOUtilFunctions.getFileSystem(path, job);
-                               
+               
                //check existence and non-empty file
                checkValidInputFile(fs, path); 
-       
+               
                //core read 
                readBinaryBlockMatrixFromHDFS(path, job, fs, ret, rlen, clen, 
brlen, bclen);
                
@@ -79,7 +79,7 @@ public class ReaderBinaryBlockParallel extends 
ReaderBinaryBlock
 
        private static void readBinaryBlockMatrixFromHDFS( Path path, JobConf 
job, FileSystem fs, MatrixBlock dest, long rlen, long clen, int brlen, int 
bclen )
                throws IOException, DMLRuntimeException
-       {                       
+       {
                //set up preferred custom serialization framework for binary 
block format
                if( MRJobConfiguration.USE_BINARYBLOCK_SERIALIZATION )
                        
MRJobConfiguration.addBinaryBlockSerializationFramework( job );
@@ -95,7 +95,7 @@ public class ReaderBinaryBlockParallel extends 
ReaderBinaryBlock
                        }
 
                        //wait until all tasks have been executed
-                       List<Future<Object>> rt = pool.invokeAll(tasks);        
+                       List<Future<Object>> rt = pool.invokeAll(tasks);
                        
                        //check for exceptions and aggregate nnz
                        long lnnz = 0;
@@ -158,15 +158,15 @@ public class ReaderBinaryBlockParallel extends 
ReaderBinaryBlock
                                        
                                        int row_offset = 
(int)(key.getRowIndex()-1)*_brlen;
                                        int col_offset = 
(int)(key.getColumnIndex()-1)*_bclen;
-                                       
                                        int rows = value.getNumRows();
                                        int cols = value.getNumColumns();
                                        
                                        //bound check per block
-                                       if( row_offset + rows < 0 || row_offset 
+ rows > _rlen || col_offset + cols<0 || col_offset + cols > _clen )
-                                       {
-                                               throw new IOException("Matrix 
block 
["+(row_offset+1)+":"+(row_offset+rows)+","+(col_offset+1)+":"+(col_offset+cols)+"]
 " +
-                                                                             
"out of overall matrix range [1:"+_rlen+",1:"+_clen+"].");
+                                       if( row_offset + rows < 0 || row_offset 
+ rows > _rlen 
+                                               || col_offset + cols<0 || 
col_offset + cols > _clen ) {
+                                               throw new IOException("Matrix 
block ["+(row_offset+1)+":"
+                                                       
+(row_offset+rows)+","+(col_offset+1)+":"+(col_offset+cols)+"] " +
+                                                       "out of overall matrix 
range [1:"+_rlen+",1:"+_clen+"].");
                                        }
                        
                                        //copy block to result
@@ -196,7 +196,7 @@ public class ReaderBinaryBlockParallel extends 
ReaderBinaryBlock
                                        else
                                        {
                                                _dest.copy( row_offset, 
row_offset+rows-1, 
-                                                                  col_offset, 
col_offset+cols-1, value, false );
+                                                       col_offset, 
col_offset+cols-1, value, false );
                                        }
                                        
                                        //aggregate nnz

http://git-wip-us.apache.org/repos/asf/systemml/blob/d9c09e77/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
index 5b1e663..aee9956 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
@@ -725,11 +725,14 @@ public class MatrixBlock extends MatrixValue implements 
CacheBlock, Externalizab
                        {
                                if( b.isEmpty(i) ) continue;
                                int aix = rowoffset+i;
-                                       
+                               
                                //single block append (avoid re-allocations)
-                               if( sparseBlock.isEmpty(aix) && coloffset==0
-                                       && b instanceof SparseBlockMCSR ) { 
-                                       sparseBlock.set(aix, b.get(i), deep);
+                               if( sparseBlock.isEmpty(aix) && coloffset==0 ) 
{ 
+                                       //note: the deep copy flag is only 
relevant for MCSR due to
+                                       //shallow references of b.get(i); other 
block formats do not
+                                       //require a redundant copy because 
b.get(i) created a new row.
+                                       boolean ldeep = (deep && b instanceof 
SparseBlockMCSR);
+                                       sparseBlock.set(aix, b.get(i), ldeep);
                                }
                                else { //general case
                                        int pos = b.pos(i);

Reply via email to