Repository: incubator-systemml
Updated Branches:
  refs/heads/master 693afd414 -> d62b2fced


[SYSTEMML-1358] Fix minor memory leaks for tests (caches, resources)

This patch fixes various minor memory leaks (such as cleanup of static
caches on exit instead of init, proper closing of file resources, and
removed redundancy) in order to reduce memory pressure on testsuite runs
within a single jvm process. 

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

Branch: refs/heads/master
Commit: 6aab005ab5fa0a430e08e68936ab5b146df8b7ea
Parents: 693afd4
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Wed Mar 1 17:35:08 2017 -0800
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Wed Mar 1 17:35:08 2017 -0800

----------------------------------------------------------------------
 .../java/org/apache/sysml/api/DMLScript.java    |   8 +-
 .../sysml/hops/codegen/SpoofCompiler.java       |  12 +-
 .../java/org/apache/sysml/lops/compile/Dag.java |   2 +-
 .../sysml/runtime/codegen/CodegenUtils.java     |   4 +
 .../compress/utils/LinearAlgebraUtils.java      | 146 +++----------------
 .../controlprogram/caching/LazyWriteBuffer.java |   2 +-
 .../org/apache/sysml/runtime/matrix/GMR.java    |  19 ++-
 .../matrix/mapred/FrameReblockBuffer.java       |   2 +-
 .../sysml/runtime/util/LocalFileUtils.java      |   7 +-
 9 files changed, 58 insertions(+), 144 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/api/DMLScript.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/DMLScript.java 
b/src/main/java/org/apache/sysml/api/DMLScript.java
index 80c78c1..e0eff6c 100644
--- a/src/main/java/org/apache/sysml/api/DMLScript.java
+++ b/src/main/java/org/apache/sysml/api/DMLScript.java
@@ -682,12 +682,12 @@ public class DMLScript
                }
                finally //ensure cleanup/shutdown
                {       
-                       if(DMLScript.USE_ACCELERATOR && ec != null) {
+                       if(DMLScript.USE_ACCELERATOR && ec != null)
                                ec.destroyGPUContext();
-                       }
-                       if(ec != null && ec instanceof SparkExecutionContext) {
+                       if( dmlconf.getBooleanValue(DMLConfig.CODEGEN) )
+                               SpoofCompiler.cleanupCodeGenerator();
+                       if(ec != null && ec instanceof SparkExecutionContext)
                                ((SparkExecutionContext) ec).close();
-                       }
                        
                        //display statistics (incl caching stats if enabled)
                        Statistics.stopRunTimer();

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java 
b/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
index dd24703..26a0b58 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
@@ -84,10 +84,7 @@ public class SpoofCompiler
        
        public static void generateCode(DMLProgram dmlp) 
                throws LanguageException, HopsException, DMLRuntimeException
-       {       
-               // cleanup static plan cache
-               planCache.clear();
-               
+       {
                // for each namespace, handle function statement blocks
                for (String namespaceKey : dmlp.getNamespaces().keySet()) {
                        for (String fname : 
dmlp.getFunctionStatementBlocks(namespaceKey).keySet()) {
@@ -177,6 +174,13 @@ public class SpoofCompiler
                return optimize(new ArrayList<Hop>(Arrays.asList(root)), 
compileLiterals).get(0);
        }
        
+       public static void cleanupCodeGenerator() {
+               if( USE_PLAN_CACHE ) {
+                       CodegenUtils.clearClassCache(); //class cache
+                       planCache.clear(); //plan cache
+               }
+       }
+       
        /**
         * Main interface of sum-product optimizer, statement block dag.
         * 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/lops/compile/Dag.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/lops/compile/Dag.java 
b/src/main/java/org/apache/sysml/lops/compile/Dag.java
index b513951..5b10677 100644
--- a/src/main/java/org/apache/sysml/lops/compile/Dag.java
+++ b/src/main/java/org/apache/sysml/lops/compile/Dag.java
@@ -127,7 +127,7 @@ public class Dag<N extends Lop>
        private HashMap<Long, Integer> IDMap = null;
 
 
-       private class NodeOutput {
+       private static class NodeOutput {
                String fileName;
                String varName;
                OutputInfo outInfo;

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java 
b/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
index fdad9bd..54b421c 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
@@ -265,4 +265,8 @@ public class CodegenUtils
                else
                        return "UNKNOWN";
        }
+       
+       public static void clearClassCache() {
+               _cache.clear();
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java 
b/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
index 7a4a013..4cc86ed 100644
--- 
a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
+++ 
b/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
@@ -19,93 +19,37 @@
 
 package org.apache.sysml.runtime.compress.utils;
 
+import org.apache.sysml.runtime.matrix.data.LibMatrixMult;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
 
 /**
- * Various low-level primitives for compressed matrix blocks, some of which
- * were copied from LibMatrixMult.
- * 
+ * This library contains all vector primitives that are used compressed 
+ * linear algebra. For primitives that exist in LibMatrixMult, these 
+ * calls are simply forwarded to ensure consistency in performance and 
+ * result correctness. 
  */
-public class LinearAlgebraUtils {
-
-       public static double dotProduct(double[] a, double[] b, final int len) 
-       {
-               double val = 0;
-               final int bn = len % 8;
-
-               // compute rest
-               for (int i = 0; i < bn; i++)
-                       val += a[i] * b[i];
-
-               // unrolled 8-block (for better instruction-level parallelism)
-               for (int i = bn; i < len; i += 8) {
-                       // read 64B cachelines of a and b
-                       // compute cval' = sum(a * b) + cval
-                       val += a[i + 0] * b[i + 0] 
-                                + a[i + 1] * b[i + 1] 
-                                + a[i + 2] * b[i + 2] 
-                                + a[i + 3] * b[i + 3] 
-                                + a[i + 4] * b[i + 4]
-                                + a[i + 5] * b[i + 5] 
-                                + a[i + 6] * b[i + 6] 
-                                + a[i + 7] * b[i + 7];
-               }
-
-               // scalar result
-               return val;
+public class LinearAlgebraUtils 
+{
+       //forwarded calls to LibMatrixMult
+       
+       public static double dotProduct(double[] a, double[] b, final int len) {
+               return LibMatrixMult.dotProduct(a, b, 0, 0, len);
        }
 
-       public static double dotProduct( double[] a, double[] b, int ai, int 
bi, final int len )
-       {
-               double val = 0;
-               final int bn = len%8;
-                               
-               //compute rest
-               for( int i = 0; i < bn; i++, ai++, bi++ )
-                       val += a[ ai ] * b[ bi ];
-               
-               //unrolled 8-block (for better instruction-level parallelism)
-               for( int i = bn; i < len; i+=8, ai+=8, bi+=8 )
-               {
-                       //read 64B cachelines of a and b
-                       //compute cval' = sum(a * b) + cval
-                       val += a[ ai+0 ] * b[ bi+0 ]
-                            + a[ ai+1 ] * b[ bi+1 ]
-                            + a[ ai+2 ] * b[ bi+2 ]
-                            + a[ ai+3 ] * b[ bi+3 ]
-                            + a[ ai+4 ] * b[ bi+4 ]
-                            + a[ ai+5 ] * b[ bi+5 ]
-                            + a[ ai+6 ] * b[ bi+6 ]
-                            + a[ ai+7 ] * b[ bi+7 ];
-               }
+       public static double dotProduct( double[] a, double[] b, int ai, int 
bi, final int len ) {
+               return LibMatrixMult.dotProduct(a, b, ai, bi, len);
+       }
                
-               //scalar result
-               return val; 
+       public static void vectMultiplyAdd( final double aval, double[] b, 
double[] c, int bi, int ci, final int len ) {
+               LibMatrixMult.vectMultiplyAdd(aval, b, c, bi, ci, len);
+       }
+       
+       public static void vectMultiplyAdd( final double aval, double[] b, 
double[] c, int[] bix, final int bi, final int ci, final int len ) {
+               LibMatrixMult.vectMultiplyAdd(aval, b, c, bix, bi, ci, len);
        }
 
-       public static void vectAdd( double[] a, double[] c, int ai, int ci, 
final int len )
-       {
-               final int bn = len%8;
-               
-               //rest, not aligned to 8-blocks
-               for( int j = 0; j < bn; j++, ai++, ci++)
-                       c[ ci ] += a[ ai ];
-               
-               //unrolled 8-block  (for better instruction-level parallelism)
-               for( int j = bn; j < len; j+=8, ai+=8, ci+=8) 
-               {
-                       //read 64B cachelines of a and c
-                       //compute c' = c * a
-                       //write back 64B cacheline of c = c'
-                       c[ ci+0 ] += a[ ai+0 ];
-                       c[ ci+1 ] += a[ ai+1 ];
-                       c[ ci+2 ] += a[ ai+2 ];
-                       c[ ci+3 ] += a[ ai+3 ];
-                       c[ ci+4 ] += a[ ai+4 ];
-                       c[ ci+5 ] += a[ ai+5 ];
-                       c[ ci+6 ] += a[ ai+6 ];
-                       c[ ci+7 ] += a[ ai+7 ];
-               }
+       public static void vectAdd( double[] a, double[] c, int ai, int ci, 
final int len ) {
+               LibMatrixMult.vectAdd(a, c, ai, ci, len);
        }
 
        public static void vectAdd( final double aval, double[] c, char[] bix, 
final int bi, final int ci, final int len )
@@ -152,52 +96,6 @@ public class LinearAlgebraUtils {
                }
        }
 
-       public static void vectMultiplyAdd( final double aval, double[] b, 
double[] c, int[] bix, final int bi, final int ci, final int len )
-       {
-               final int bn = (len-bi)%8;
-               
-               //rest, not aligned to 8-blocks
-               for( int j = bi; j < bi+bn; j++ )
-                       c[ ci + bix[j] ] += aval * b[ j ];
-               
-               //unrolled 8-block (for better instruction-level parallelism)
-               for( int j = bi+bn; j < len; j+=8 )
-               {
-                       c[ ci+bix[j+0] ] += aval * b[ j+0 ];
-                       c[ ci+bix[j+1] ] += aval * b[ j+1 ];
-                       c[ ci+bix[j+2] ] += aval * b[ j+2 ];
-                       c[ ci+bix[j+3] ] += aval * b[ j+3 ];
-                       c[ ci+bix[j+4] ] += aval * b[ j+4 ];
-                       c[ ci+bix[j+5] ] += aval * b[ j+5 ];
-                       c[ ci+bix[j+6] ] += aval * b[ j+6 ];
-                       c[ ci+bix[j+7] ] += aval * b[ j+7 ];
-               }
-       }
-
-       public static void vectMultiplyAdd( final double aval, double[] b, 
double[] c, int bi, int ci, final int len )
-       {
-               final int bn = len%8;
-               
-               //rest, not aligned to 8-blocks
-               for( int j = 0; j < bn; j++, bi++, ci++)
-                       c[ ci ] += aval * b[ bi ];
-               
-               //unrolled 8-block  (for better instruction-level parallelism)
-               for( int j = bn; j < len; j+=8, bi+=8, ci+=8) 
-               {
-                       //read 64B cachelines of b and c
-                       //compute c' = aval * b + c
-                       //write back 64B cacheline of c = c'
-                       c[ ci+0 ] += aval * b[ bi+0 ];
-                       c[ ci+1 ] += aval * b[ bi+1 ];
-                       c[ ci+2 ] += aval * b[ bi+2 ];
-                       c[ ci+3 ] += aval * b[ bi+3 ];
-                       c[ ci+4 ] += aval * b[ bi+4 ];
-                       c[ ci+5 ] += aval * b[ bi+5 ];
-                       c[ ci+6 ] += aval * b[ bi+6 ];
-                       c[ ci+7 ] += aval * b[ bi+7 ];
-               }
-       }
 
        public static double vectSum( double[] a, char[] bix, final int ai, 
final int bi, final int len )
        {

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
 
b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
index a230d7b..212800d 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
@@ -308,7 +308,7 @@ public class LazyWriteBuffer
                                _pool.shutdown();
                }
                
-               private class FileCleanerTask implements Runnable {
+               private static class FileCleanerTask implements Runnable {
                        private String _fname = null;
                        
                        public FileCleanerTask( String fname ) {

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/runtime/matrix/GMR.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/GMR.java 
b/src/main/java/org/apache/sysml/runtime/matrix/GMR.java
index 6f3e249..1024070 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/GMR.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/GMR.java
@@ -188,7 +188,8 @@ public class GMR
                        }
                }
                
-               setupDistributedCache(job, instructionsInMapper, 
otherInstructionsInReducer, realinputs, realrlens, realclens);
+               boolean resetDistCache = setupDistributedCache(job, 
instructionsInMapper, 
+                               otherInstructionsInReducer, realinputs, 
realrlens, realclens);
 
                //set up the input files and their format information
                boolean[] distCacheOnly = getDistCacheOnlyInputs(realIndexes, 
recordReaderInstruction, instructionsInMapper, aggInstructionsInReducer, 
otherInstructionsInReducer);
@@ -301,20 +302,20 @@ public class GMR
                RunningJob runjob=JobClient.runJob(job);
                
                Group 
group=runjob.getCounters().getGroup(MRJobConfiguration.NUM_NONZERO_CELLS);
-               //MatrixCharacteristics[] stats=new 
MatrixCharacteristics[resultIndexes.length];
-               for(int i=0; i<resultIndexes.length; i++) {
-                       // number of non-zeros
+               for(int i=0; i<resultIndexes.length; i++)
                        
stats[i].setNonZeros(group.getCounter(Integer.toString(i)));
-               }
                
+               //cleanups
                String dir = dimsUnknownFilePrefix + "/" + 
runjob.getID().toString() + "_dimsFile";
                stats = MapReduceTool.processDimsFiles(dir, stats);
                MapReduceTool.deleteFileIfExistOnHDFS(dir);
+               if( resetDistCache )
+                       MRBaseForCommonInstructions.resetDistCache();
                
                return new JobReturn(stats, outputInfos, runjob.isSuccessful());
        }
 
-       private static void setupDistributedCache(JobConf job, String instMap, 
String instRed, String[] inputs, long[] rlens, long[] clens) 
+       private static boolean setupDistributedCache(JobConf job, String 
instMap, String instRed, String[] inputs, long[] rlens, long[] clens) 
                throws DMLRuntimeException 
        {
                //concatenate mapper and reducer instructions
@@ -367,9 +368,13 @@ public class GMR
                        MRJobConfiguration.setupDistCacheInputs(job, 
indexString.toString(), pathString.toString(), pathList);
                        
                        //clean in-memory cache (prevent job interference in 
local mode)
-                       if( InfrastructureAnalyzer.isLocalMode(job) )
+                       if( InfrastructureAnalyzer.isLocalMode(job) ) {
                                MRBaseForCommonInstructions.resetDistCache();
+                               return true;
+                       }
                }
+               
+               return false;
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/runtime/matrix/mapred/FrameReblockBuffer.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/mapred/FrameReblockBuffer.java 
b/src/main/java/org/apache/sysml/runtime/matrix/mapred/FrameReblockBuffer.java
index d8fa3e2..7a0b8c2 100644
--- 
a/src/main/java/org/apache/sysml/runtime/matrix/mapred/FrameReblockBuffer.java
+++ 
b/src/main/java/org/apache/sysml/runtime/matrix/mapred/FrameReblockBuffer.java
@@ -174,7 +174,7 @@ public class FrameReblockBuffer
         * compute the block indexes on-the-fly based on the given cell indexes.
         * 
         */
-       private class FrameReblockBufferComparator implements 
Comparator<FrameCell> 
+       private static class FrameReblockBufferComparator implements 
Comparator<FrameCell> 
        {       
                @Override
                public int compare(FrameCell arg0, FrameCell arg1) 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/6aab005a/src/main/java/org/apache/sysml/runtime/util/LocalFileUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/util/LocalFileUtils.java 
b/src/main/java/org/apache/sysml/runtime/util/LocalFileUtils.java
index ec145cb..82f1463 100644
--- a/src/main/java/org/apache/sysml/runtime/util/LocalFileUtils.java
+++ b/src/main/java/org/apache/sysml/runtime/util/LocalFileUtils.java
@@ -123,8 +123,8 @@ public class LocalFileUtils
                        ret.readFields(in);
                }
                finally {
-                       IOUtilFunctions.closeSilently(
-                                       (InputStream)in);
+                       IOUtilFunctions.closeSilently((InputStream)in);
+                       IOUtilFunctions.closeSilently(fis);
                }
                        
                return ret;
@@ -169,6 +169,7 @@ public class LocalFileUtils
                }
                finally {
                        IOUtilFunctions.closeSilently(out);
+                       IOUtilFunctions.closeSilently(fos);
                }       
        }
 
@@ -208,6 +209,7 @@ public class LocalFileUtils
                }
                finally {
                        IOUtilFunctions.closeSilently(in);
+                       IOUtilFunctions.closeSilently(fis);
                }
                        
                return bufferSize;
@@ -232,6 +234,7 @@ public class LocalFileUtils
                }
                finally{
                        IOUtilFunctions.closeSilently(out);     
+                       IOUtilFunctions.closeSilently(fos);
                }       
        }
 

Reply via email to