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); } }