[SYSTEMML-1750] Enable dynamic recompilation in JMLC and single-node

This patch exposed optional compiler configurations through JMLC
connections in order to enable dynamic recompilation and multi-threading
for significant performance improvements on moderately large data. For
example, on a MLogreg text classification scenario with 28,556 x
2,123,544 sparse inputs this patch improved the end-to-end performance
by more than 2x compared to a baseline without dynamic recompilation
(even though both used forced single-node execution).


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

Branch: refs/heads/master
Commit: 36effc54d00507e22b1e17bbae657104d6b7fd8f
Parents: 9e87f00
Author: Matthias Boehm <[email protected]>
Authored: Thu Jul 6 23:16:02 2017 -0700
Committer: Matthias Boehm <[email protected]>
Committed: Fri Jul 7 11:25:32 2017 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/api/jmlc/Connection.java   | 23 +++++++-
 .../org/apache/sysml/api/jmlc/JMLCProxy.java    | 55 ++++++++++++++++++++
 .../java/org/apache/sysml/hops/AggBinaryOp.java |  5 +-
 .../java/org/apache/sysml/hops/AggUnaryOp.java  |  5 +-
 .../java/org/apache/sysml/hops/BinaryOp.java    |  4 +-
 .../org/apache/sysml/hops/ConvolutionOp.java    |  4 +-
 .../java/org/apache/sysml/hops/DataGenOp.java   |  5 +-
 src/main/java/org/apache/sysml/hops/DataOp.java |  6 +--
 src/main/java/org/apache/sysml/hops/Hop.java    | 31 +++++++++--
 .../java/org/apache/sysml/hops/IndexingOp.java  |  4 +-
 .../org/apache/sysml/hops/LeftIndexingOp.java   |  5 +-
 .../java/org/apache/sysml/hops/MultipleOp.java  | 26 ++++-----
 .../sysml/hops/ParameterizedBuiltinOp.java      |  4 +-
 .../org/apache/sysml/hops/QuaternaryOp.java     |  6 +--
 .../java/org/apache/sysml/hops/ReorgOp.java     |  6 +--
 .../java/org/apache/sysml/hops/TernaryOp.java   | 16 +++---
 .../java/org/apache/sysml/hops/UnaryOp.java     |  6 +--
 .../apache/sysml/hops/recompile/Recompiler.java | 10 +++-
 .../runtime/controlprogram/ProgramBlock.java    |  4 --
 19 files changed, 148 insertions(+), 77 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/api/jmlc/Connection.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/jmlc/Connection.java 
b/src/main/java/org/apache/sysml/api/jmlc/Connection.java
index 689ffc7..43fb3e0 100644
--- a/src/main/java/org/apache/sysml/api/jmlc/Connection.java
+++ b/src/main/java/org/apache/sysml/api/jmlc/Connection.java
@@ -128,6 +128,23 @@ public class Connection implements Closeable
        }
        
        /**
+        * Connection constructor, the starting point for any other JMLC API 
calls.
+        * This variant allows to enable a set of boolean compiler 
configurations.
+        * 
+        * @param config one or many boolean compiler configurations to enable.
+        */
+       public Connection(CompilerConfig.ConfigType... configs) {
+               //basic constructor, which also constructs the compiler config
+               this();
+               
+               //set optional compiler configurations in current config
+               CompilerConfig cconf = ConfigurationManager.getCompilerConfig();
+               for( ConfigType configType : configs )
+                       cconf.set(configType, true);
+               ConfigurationManager.setLocalConfig(cconf);
+       }
+       
+       /**
         * Prepares (precompiles) a script and registers input and output 
variables.
         * 
         * @param script string representing the DML or PyDML script
@@ -190,7 +207,9 @@ public class Connection implements Closeable
                        //final cleanup runtime prog
                        JMLCUtils.cleanupRuntimeProgram(rtprog, outputs);
                        
-                       //System.out.println(Explain.explain(rtprog));
+                       //activate thread-local proxy for dynamic recompilation
+                       if( ConfigurationManager.isDynamicRecompilation() )
+                               JMLCProxy.setActive(outputs);
                }
                catch(ParseException pe) {
                        // don't chain ParseException (for cleaner error output)
@@ -212,6 +231,8 @@ public class Connection implements Closeable
        public void close() {
                //clear thread-local dml / compiler configs
                ConfigurationManager.clearLocalConfigs();
+               if( ConfigurationManager.isDynamicRecompilation() )
+                       JMLCProxy.setActive(null);
        }
        
        /**

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/api/jmlc/JMLCProxy.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/jmlc/JMLCProxy.java 
b/src/main/java/org/apache/sysml/api/jmlc/JMLCProxy.java
new file mode 100644
index 0000000..b17857b
--- /dev/null
+++ b/src/main/java/org/apache/sysml/api/jmlc/JMLCProxy.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sysml.api.jmlc;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+
+import org.apache.sysml.runtime.instructions.Instruction;
+
+/**
+ * This proxy provides thread-local access to output variables per connection
+ * in order to enable dynamic recompilation in JMLC.
+ */
+public class JMLCProxy
+{
+       private static ThreadLocal<HashSet<String>> _outputs = new 
ThreadLocal<HashSet<String>>() {
+               @Override 
+               protected HashSet<String> initialValue() { 
+                       return null;
+               }
+       };
+       
+       public static void setActive(String[] output) {
+               if( output != null )
+                       _outputs.set(new 
HashSet<String>(Arrays.asList(output)));
+               else
+                       _outputs.remove();
+       }
+
+       public static boolean isActive() {
+               return (_outputs.get() != null);
+       }
+
+       public static ArrayList<Instruction> 
performCleanupAfterRecompilation(ArrayList<Instruction> tmp) {
+               return JMLCUtils.cleanupRuntimeInstructions(tmp, 
_outputs.get());
+       }
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/AggBinaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/AggBinaryOp.java 
b/src/main/java/org/apache/sysml/hops/AggBinaryOp.java
index c721efe..eb83549 100644
--- a/src/main/java/org/apache/sysml/hops/AggBinaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/AggBinaryOp.java
@@ -21,7 +21,6 @@ package org.apache.sysml.hops;
 
 import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.api.DMLScript.RUNTIME_PLATFORM;
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.Binary;
@@ -436,9 +435,7 @@ public class AggBinaryOp extends Hop implements 
MultiThreadedHop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE ) {
-                       setRequiresRecompile();                 
-               }
+               setRequiresRecompileIfNecessary();
                
                return _etype;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/AggUnaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/AggUnaryOp.java 
b/src/main/java/org/apache/sysml/hops/AggUnaryOp.java
index eb469ab..e2f2a8e 100644
--- a/src/main/java/org/apache/sysml/hops/AggUnaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/AggUnaryOp.java
@@ -20,7 +20,6 @@
 package org.apache.sysml.hops;
 
 import org.apache.sysml.api.DMLScript;
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.AggBinaryOp.SparkAggType;
 import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
@@ -450,9 +449,7 @@ public class AggUnaryOp extends Hop implements 
MultiThreadedHop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE ) {
-                       setRequiresRecompile();
-               }
+               setRequiresRecompileIfNecessary();
                
                return _etype;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/BinaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/BinaryOp.java 
b/src/main/java/org/apache/sysml/hops/BinaryOp.java
index 36f573c..6175621 100644
--- a/src/main/java/org/apache/sysml/hops/BinaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/BinaryOp.java
@@ -1010,9 +1010,7 @@ public class BinaryOp extends Hop
                }
 
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE ) {
-                       setRequiresRecompile();
-               }
+               setRequiresRecompileIfNecessary();
                
                //ensure cp exec type for single-node operations
                if ( op == OpOp2.SOLVE ) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/ConvolutionOp.java 
b/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
index 8303e73..a3d8a81 100644
--- a/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
+++ b/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
@@ -19,7 +19,6 @@
 
 package org.apache.sysml.hops;
 
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.lops.ConvolutionTransform;
 import org.apache.sysml.lops.ConvolutionTransform.OperationTypes;
@@ -335,8 +334,7 @@ public class ConvolutionOp extends Hop  implements 
MultiThreadedHop
                _etype = !isEligibleForSpark() && _etype == REMOTE ?  
ExecType.CP : _etype;
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
+               setRequiresRecompileIfNecessary();
                
                return _etype;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/DataGenOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/DataGenOp.java 
b/src/main/java/org/apache/sysml/hops/DataGenOp.java
index 3f29358..ce08dbc 100644
--- a/src/main/java/org/apache/sysml/hops/DataGenOp.java
+++ b/src/main/java/org/apache/sysml/hops/DataGenOp.java
@@ -293,9 +293,8 @@ public class DataGenOp extends Hop implements 
MultiThreadedHop
                }
 
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
-
+               setRequiresRecompileIfNecessary();
+               
                //always force string initialization into CP (not supported in 
MR)
                //similarly, sample is currently not supported in MR either
                if( _op == DataGenMethod.SINIT )

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/DataOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/DataOp.java 
b/src/main/java/org/apache/sysml/hops/DataOp.java
index 8653360..bcded04 100644
--- a/src/main/java/org/apache/sysml/hops/DataOp.java
+++ b/src/main/java/org/apache/sysml/hops/DataOp.java
@@ -454,7 +454,7 @@ public class DataOp extends Hop
                        if( getDataType()==DataType.SCALAR || 
(getDataType()==DataType.FRAME && REMOTE==ExecType.MR) )
                                _etypeForced = ExecType.CP;
                        
-                       if( _etypeForced != null )                      
+                       if( _etypeForced != null )
                        {
                                _etype = _etypeForced;
                        }
@@ -478,9 +478,7 @@ public class DataOp extends Hop
                        }
                        
                        //mark for recompile (forever)
-                       if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE ) {
-                               setRequiresRecompile();
-                       }
+                       setRequiresRecompileIfNecessary();
                }
            else //READ
                {

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/Hop.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/Hop.java 
b/src/main/java/org/apache/sysml/hops/Hop.java
index 81c4cdc..8f8afde 100644
--- a/src/main/java/org/apache/sysml/hops/Hop.java
+++ b/src/main/java/org/apache/sysml/hops/Hop.java
@@ -1472,17 +1472,38 @@ public abstract class Hop
        /**
         * Indicates if dynamic recompilation is required for this hop. 
         * 
-        * @return true if dynamic recompilcation required
+        * @return true if dynamic recompilation required
         */
-       public boolean requiresRecompile() 
-       {
+       public boolean requiresRecompile() {
                return _requiresRecompile;
        }
        
-       public void setRequiresRecompile()
-       {
+       /**
+        * Marks the hop for dynamic recompilation. 
+        */
+       public void setRequiresRecompile() {
                _requiresRecompile = true;
        }
+       
+       /**
+        * Marks the hop for dynamic recompilation, if dynamic recompilation is 
+        * enabled and one of the two basic scenarios apply:
+        * <ul>
+        *  <li> The hop has unknown dimensions or sparsity and is scheduled 
for 
+        *    remote execution, in which case the latency for distributed jobs 
easily 
+        *    covers any recompilation overheads. </li>
+        *  <li> The hop has unknown dimensions and is scheduled for local 
execution 
+        *    due to forced single node execution type. </li>
+        * <ul> <p>
+        */
+       protected void setRequiresRecompileIfNecessary() {
+               ExecType REMOTE = OptimizerUtils.isSparkExecutionMode() ? 
ExecType.SPARK : ExecType.MR;
+               boolean caseRemote = (!dimsKnown(true) && _etype == REMOTE);
+               boolean caseLocal = (!dimsKnown() && _etypeForced == 
ExecType.CP);
+               
+               if( ConfigurationManager.isDynamicRecompilation() && 
(caseRemote || caseLocal) )
+                       setRequiresRecompile();
+       }
 
        /**
         * Update the output size information for this hop.

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/IndexingOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/IndexingOp.java 
b/src/main/java/org/apache/sysml/hops/IndexingOp.java
index e446552..5a27ed6 100644
--- a/src/main/java/org/apache/sysml/hops/IndexingOp.java
+++ b/src/main/java/org/apache/sysml/hops/IndexingOp.java
@@ -19,7 +19,6 @@
 
 package org.apache.sysml.hops;
 
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.AggBinaryOp.SparkAggType;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
@@ -376,8 +375,7 @@ public class IndexingOp extends Hop
                }
 
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
+               setRequiresRecompileIfNecessary();
                
                return _etype;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/LeftIndexingOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/LeftIndexingOp.java 
b/src/main/java/org/apache/sysml/hops/LeftIndexingOp.java
index c6769d4..601cb6f 100644
--- a/src/main/java/org/apache/sysml/hops/LeftIndexingOp.java
+++ b/src/main/java/org/apache/sysml/hops/LeftIndexingOp.java
@@ -389,9 +389,8 @@ public class LeftIndexingOp  extends Hop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
-       
+               setRequiresRecompileIfNecessary();
+               
                return _etype;
        }
 

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/MultipleOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/MultipleOp.java 
b/src/main/java/org/apache/sysml/hops/MultipleOp.java
index 688204f..5fb6b29 100644
--- a/src/main/java/org/apache/sysml/hops/MultipleOp.java
+++ b/src/main/java/org/apache/sysml/hops/MultipleOp.java
@@ -35,7 +35,7 @@ import org.apache.sysml.parser.Expression.ValueType;
  *
  */
 public class MultipleOp extends Hop {
-       protected MultiInputOp multipleOperandOperation = null;
+       protected MultiInputOp _op = null;
 
        protected MultipleOp() {
        }
@@ -60,15 +60,12 @@ public class MultipleOp extends Hop {
        public MultipleOp(String name, DataType dataType, ValueType valueType,
                        MultiInputOp multipleOperandOperation, Hop... inputs) 
throws HopsException {
                super(name, dataType, valueType);
-               this.multipleOperandOperation = multipleOperandOperation;
+               _op = multipleOperandOperation;
 
                for (int i = 0; i < inputs.length; i++) {
                        getInput().add(i, inputs[i]);
                        inputs[i].getParent().add(this);
                }
-
-               // compute unknown dims and nnz
-               refreshSizeInformation();
        }
 
        /** MultipleOp may have any number of inputs. */
@@ -76,12 +73,12 @@ public class MultipleOp extends Hop {
        public void checkArity() throws HopsException {}
 
        public MultiInputOp getOp() {
-               return multipleOperandOperation;
+               return _op;
        }
 
        @Override
        public String getOpString() {
-               return "m(" + multipleOperandOperation.toString().toLowerCase() 
+ ")";
+               return "m(" + _op.name().toLowerCase() + ")";
        }
 
        /**
@@ -102,10 +99,10 @@ public class MultipleOp extends Hop {
                                inLops[i] = inLop;
                        }
 
-                       MultipleCP.OperationType opType = 
MultipleOperandOperationHopTypeToLopType.get(multipleOperandOperation);
+                       MultipleCP.OperationType opType = 
MultipleOperandOperationHopTypeToLopType.get(_op);
                        if (opType == null) {
-                               throw new HopsException("Unknown MultipleCP Lop 
operation type for MultipleOperandOperation Hop type '"
-                                               + multipleOperandOperation + 
"'");
+                               throw new HopsException("Unknown MultipleCP Lop 
operation type for "
+                                               + "MultipleOperandOperation Hop 
type '" + _op + "'");
                        }
 
                        MultipleCP multipleCPLop = new MultipleCP(opType, 
getDataType(), getValueType(), inLops);
@@ -130,12 +127,11 @@ public class MultipleOp extends Hop {
 
        @Override
        public boolean allowsAllExecTypes() {
-               return false; // true?
+               return false;
        }
 
        @Override
        protected ExecType optFindExecType() throws HopsException {
-               checkAndSetForcedPlatform(); // ?
                return ExecType.CP;
        }
 
@@ -152,7 +148,7 @@ public class MultipleOp extends Hop {
                multipleOp.clone(this, false);
 
                // copy specific attributes
-               multipleOp.multipleOperandOperation = multipleOperandOperation;
+               multipleOp._op = _op;
 
                return multipleOp;
        }
@@ -162,14 +158,14 @@ public class MultipleOp extends Hop {
                if (!(that instanceof MultipleOp))
                        return false;
 
-               if (multipleOperandOperation == MultiInputOp.PRINTF) {
+               if (_op == MultiInputOp.PRINTF) {
                        return false;
                }
 
                // if add new multiple operand types in addition to PRINTF,
                // probably need to modify this.
                MultipleOp mo = (MultipleOp) that;
-               return (multipleOperandOperation == 
mo.multipleOperandOperation);
+               return (_op == mo._op);
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java 
b/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
index 88ec360..7d6fe2a 100644
--- a/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
+++ b/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
@@ -22,7 +22,6 @@ package org.apache.sysml.hops;
 import java.util.HashMap;
 import java.util.Map.Entry;
 
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
@@ -1103,8 +1102,7 @@ public class ParameterizedBuiltinOp extends Hop 
implements MultiThreadedHop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
+               setRequiresRecompileIfNecessary();
                
                return _etype;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/QuaternaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/QuaternaryOp.java 
b/src/main/java/org/apache/sysml/hops/QuaternaryOp.java
index e3dfa54..6517de6 100644
--- a/src/main/java/org/apache/sysml/hops/QuaternaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/QuaternaryOp.java
@@ -19,7 +19,6 @@
 
 package org.apache.sysml.hops;
 
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.DataPartition;
@@ -1490,9 +1489,8 @@ public class QuaternaryOp extends Hop implements 
MultiThreadedHop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
-       
+               setRequiresRecompileIfNecessary();
+               
                return _etype;
        }
        

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/ReorgOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/ReorgOp.java 
b/src/main/java/org/apache/sysml/hops/ReorgOp.java
index 8ed308b..20cd68d 100644
--- a/src/main/java/org/apache/sysml/hops/ReorgOp.java
+++ b/src/main/java/org/apache/sysml/hops/ReorgOp.java
@@ -22,7 +22,6 @@ package org.apache.sysml.hops;
 import java.util.ArrayList;
 
 import org.apache.sysml.api.DMLScript;
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
@@ -540,9 +539,8 @@ public class ReorgOp extends Hop implements MultiThreadedHop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
-       
+               setRequiresRecompileIfNecessary();
+               
                return _etype;
        }
        

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/TernaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/TernaryOp.java 
b/src/main/java/org/apache/sysml/hops/TernaryOp.java
index 458a346..5a12dea 100644
--- a/src/main/java/org/apache/sysml/hops/TernaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/TernaryOp.java
@@ -849,12 +849,12 @@ public class TernaryOp extends Hop
                }
 
                //mark for recompile (forever)
-               // Necessary condition for recompilation is unknown dimensions.
-               // When execType=CP, it is marked for recompilation only when 
additional
-               // dimension inputs are provided (and those values are unknown 
at initial compile time).
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) ) {
-                       if ( _etype==REMOTE || (_etype == ExecType.CP && 
_dimInputsPresent))
-                               setRequiresRecompile();
+               // additional condition: when execType=CP and additional 
dimension inputs 
+               // are provided (and those values are unknown at initial 
compile time).
+               setRequiresRecompileIfNecessary();
+               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) 
+                       && _etype == ExecType.CP && _dimInputsPresent) {
+                       setRequiresRecompile();
                }
                
                return _etype;
@@ -1079,10 +1079,8 @@ public class TernaryOp extends Hop
                                }                       
                        }
                }
-               catch(Exception ex)
-               {
+               catch(Exception ex) {
                        throw new RuntimeException(ex);
-                       //ret = false;
                }
                
                return ret;

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/UnaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/UnaryOp.java 
b/src/main/java/org/apache/sysml/hops/UnaryOp.java
index 176d131..d90fcdf 100644
--- a/src/main/java/org/apache/sysml/hops/UnaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/UnaryOp.java
@@ -21,7 +21,6 @@ package org.apache.sysml.hops;
 
 import java.util.ArrayList;
 
-import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.Aggregate.OperationTypes;
@@ -667,9 +666,8 @@ public class UnaryOp extends Hop implements MultiThreadedHop
                }
                
                //mark for recompile (forever)
-               if( ConfigurationManager.isDynamicRecompilation() && 
!dimsKnown(true) && _etype==REMOTE )
-                       setRequiresRecompile();
-
+               setRequiresRecompileIfNecessary();
+               
                //ensure cp exec type for single-node operations
                if( _op == OpOp1.PRINT || _op == OpOp1.STOP 
                        || _op == OpOp1.INVERSE || _op == OpOp1.EIGEN || _op == 
OpOp1.CHOLESKY )

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java 
b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
index 15376ae..04d521b7 100644
--- a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
+++ b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
@@ -32,6 +32,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.wink.json4j.JSONObject;
 import org.apache.sysml.api.DMLScript;
+import org.apache.sysml.api.jmlc.JMLCProxy;
 import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.conf.DMLConfig;
 import org.apache.sysml.conf.CompilerConfig.ConfigType;
@@ -105,6 +106,7 @@ import org.apache.sysml.runtime.util.UtilFunctions;
 import org.apache.sysml.utils.Explain;
 import org.apache.sysml.utils.Explain.ExplainType;
 import org.apache.sysml.utils.JSONHelper;
+import org.apache.sysml.utils.MLContextProxy;
 
 /**
  * Dynamic recompilation of hop dags to runtime instructions, which includes 
the 
@@ -235,13 +237,19 @@ public class Recompiler
                        }               
                        
                        // generate runtime instructions (incl piggybacking)
-                       newInst = dag.getJobs(sb, 
ConfigurationManager.getDMLConfig()); 
+                       newInst = dag.getJobs(sb, 
ConfigurationManager.getDMLConfig());
                }
                
                // replace thread ids in new instructions
                if( tid != 0 ) //only in parfor context
                        newInst = 
ProgramConverter.createDeepCopyInstructionSet(newInst, tid, -1, null, null, 
null, false, false);
                
+               // remove writes if called through mlcontext or jmlc 
+               if( MLContextProxy.isActive() )
+                       newInst = 
MLContextProxy.performCleanupAfterRecompilation(newInst);
+               else if( JMLCProxy.isActive() )
+                       newInst = 
JMLCProxy.performCleanupAfterRecompilation(newInst);
+               
                // explain recompiled hops / instructions
                if( DMLScript.EXPLAIN == ExplainType.RECOMPILE_HOPS ){
                        LOG.info("EXPLAIN RECOMPILE \nGENERIC (lines 
"+sb.getBeginLine()+"-"+sb.getEndLine()+"):\n" + 

http://git-wip-us.apache.org/repos/asf/systemml/blob/36effc54/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java 
b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
index 5ae5d80..209c566 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
@@ -46,7 +46,6 @@ import org.apache.sysml.runtime.instructions.cp.ScalarObject;
 import org.apache.sysml.runtime.instructions.cp.StringObject;
 import org.apache.sysml.runtime.instructions.cp.VariableCPInstruction;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
-import org.apache.sysml.utils.MLContextProxy;
 import org.apache.sysml.utils.Statistics;
 import org.apache.sysml.yarn.DMLAppMasterUtils;
 
@@ -147,9 +146,6 @@ public class ProgramBlock
                        {
                                tmp = Recompiler.recompileHopsDag(
                                        _sb, _sb.get_hops(), ec.getVariables(), 
null, false, true, _tid);
-
-                               if( MLContextProxy.isActive() )
-                                       tmp = 
MLContextProxy.performCleanupAfterRecompilation(tmp);
                        }
                        if( DMLScript.STATISTICS ){
                                long t1 = System.nanoTime();

Reply via email to