Repository: systemml
Updated Branches:
  refs/heads/master e4220e3bc -> 23df1484f


[SYSTEMML-2397] Fix relu_backward parallelism in paramserv/parfor

This patch fixes the instruction parallelism of relu_backward
operations, which are constructed out of binary hops that were not
subject to parallelism constraints so far.

Furthermore, this also includes a rework of the abstraction for
multi-threaded hops to avoid code duplication.


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

Branch: refs/heads/master
Commit: fcf73079633d1fc241dfa28f596c2fe0d4d7039b
Parents: e4220e3
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Fri Jun 15 17:42:34 2018 -0700
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Fri Jun 15 18:58:39 2018 -0700

----------------------------------------------------------------------
 .../java/org/apache/sysml/hops/AggBinaryOp.java | 18 ++------
 .../java/org/apache/sysml/hops/AggUnaryOp.java  | 23 +---------
 .../java/org/apache/sysml/hops/BinaryOp.java    | 18 ++++----
 .../org/apache/sysml/hops/ConvolutionOp.java    | 24 +++-------
 .../java/org/apache/sysml/hops/DataGenOp.java   | 14 +-----
 src/main/java/org/apache/sysml/hops/Hop.java    |  8 ----
 .../org/apache/sysml/hops/MultiThreadedHop.java | 47 ++++++++++++++++++++
 .../sysml/hops/ParameterizedBuiltinOp.java      | 15 +------
 .../org/apache/sysml/hops/QuaternaryOp.java     | 14 +-----
 .../java/org/apache/sysml/hops/ReorgOp.java     | 14 +-----
 .../java/org/apache/sysml/hops/UnaryOp.java     | 16 +------
 .../apache/sysml/hops/codegen/SpoofFusedOp.java | 23 +++-------
 .../apache/sysml/lops/ConvolutionTransform.java | 14 +++---
 .../parfor/opt/OptTreeConverter.java            |  2 +-
 .../parfor/opt/OptimizerRuleBased.java          |  6 ++-
 .../cp/ConvolutionCPInstruction.java            |  1 +
 .../cp/ParamservBuiltinCPInstruction.java       |  5 ++-
 17 files changed, 93 insertions(+), 169 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 9a286d2..9b2b650 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.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.Binary;
@@ -63,7 +62,7 @@ import org.apache.sysml.runtime.util.UtilFunctions;
  *             Semantic: generate indices, align, cross-operate, generate 
indices, align, aggregate
  */
 
-public class AggBinaryOp extends Hop implements MultiThreadedHop
+public class AggBinaryOp extends MultiThreadedHop
 {
        public static final double MAPMULT_MEM_MULTIPLIER = 1.0;
        public static MMultMethod FORCED_MMULT_METHOD = null;
@@ -95,7 +94,6 @@ public class AggBinaryOp extends Hop implements 
MultiThreadedHop
        
        //hints set by previous to operator selection
        private boolean _hasLeftPMInput = false; //left input is permutation 
matrix
-       private int _maxNumThreads = -1; //-1 for unlimited
        
        private AggBinaryOp() {
                //default constructor for clone
@@ -128,16 +126,6 @@ public class AggBinaryOp extends Hop implements 
MultiThreadedHop
                return _hasLeftPMInput;
        }
 
-       @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
        public MMultMethod getMMultMethod(){
                return _method;
        }
@@ -1819,14 +1807,14 @@ public class AggBinaryOp extends Hop implements 
MultiThreadedHop
        @Override
        public Object clone() throws CloneNotSupportedException 
        {
-               AggBinaryOp ret = new AggBinaryOp();    
+               AggBinaryOp ret = new AggBinaryOp();
                
                //copy generic attributes
                ret.clone(this, false);
                
                //copy specific attributes
                ret.innerOp = innerOp;
-               ret.outerOp = outerOp;          
+               ret.outerOp = outerOp;
                ret._hasLeftPMInput = _hasLeftPMInput;
                ret._maxNumThreads = _maxNumThreads;
                

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 d3e0570..116ed91 100644
--- a/src/main/java/org/apache/sysml/hops/AggUnaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/AggUnaryOp.java
@@ -21,7 +21,6 @@ package org.apache.sysml.hops;
 
 import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.hops.AggBinaryOp.SparkAggType;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.Aggregate.OperationTypes;
@@ -41,24 +40,15 @@ import 
org.apache.sysml.runtime.controlprogram.context.SparkExecutionContext;
 import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
 
 
-/* Aggregate unary (cell) operation: Sum (aij), col_sum, row_sum
- *             Properties: 
- *                     Symbol: +, min, max, ...
- *                     1 Operand
- *     
- *             Semantic: generate indices, align, aggregate
- */
+// Aggregate unary (cell) operation: Sum (aij), col_sum, row_sum
 
-public class AggUnaryOp extends Hop implements MultiThreadedHop
+public class AggUnaryOp extends MultiThreadedHop
 {
-       
        private static final boolean ALLOW_UNARYAGG_WO_FINAL_AGG = true;
        
        private AggOp _op;
        private Direction _direction;
 
-       private int _maxNumThreads = -1; //-1 for unlimited
-       
        private AggUnaryOp() {
                //default constructor for clone
        }
@@ -97,15 +87,6 @@ public class AggUnaryOp extends Hop implements 
MultiThreadedHop
                _direction = direction;
        }
 
-       @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
        
        @Override
        public boolean isGPUEnabled() {

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 1a65130..0c3f96c 100644
--- a/src/main/java/org/apache/sysml/hops/BinaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/BinaryOp.java
@@ -63,9 +63,8 @@ import 
org.apache.sysml.runtime.matrix.mapred.DistributedCacheInput;
  *             Semantic: align indices (sort), then perform operation
  */
 
-public class BinaryOp extends Hop 
+public class BinaryOp extends MultiThreadedHop
 {
-       
        //we use the full remote memory budget (but reduced by sort buffer), 
        public static final double APPEND_MEM_MULTIPLIER = 1.0;
        
@@ -74,7 +73,6 @@ public class BinaryOp extends Hop
        
        public static AppendMethod FORCED_APPEND_METHOD = null;
        
-       
        public enum AppendMethod { 
                CP_APPEND, //in-memory general case append (implicitly selected 
for CP)
                MR_MAPPEND, //map-only append (rhs must be vector and fit in 
mapper mem)
@@ -650,14 +648,14 @@ public class BinaryOp extends Hop
                                Hop potentialZero = isLeftXGt ? ((BinaryOp) 
getInput().get(0)).getInput().get(1) : null;
                                
                                boolean isLeftXGt0 = isLeftXGt && potentialZero 
!= null
-                                               && potentialZero instanceof 
LiteralOp && ((LiteralOp) potentialZero).getDoubleValue() == 0;
-                                               
+                                       && 
HopRewriteUtils.isLiteralOfValue(potentialZero, 0);
+                               
                                if(op == OpOp2.MULT && isLeftXGt0 && 
                                        !getInput().get(0).isVector() && 
!getInput().get(1).isVector()
                                        && getInput().get(0).dimsKnown() && 
getInput().get(1).dimsKnown()) {
                                        binary = new 
ConvolutionTransform(getInput().get(0).getInput().get(0).constructLops(), 
-                                                                       
getInput().get(1).constructLops(),
-                                                                       
ConvolutionTransform.OperationTypes.RELU_BACKWARD, getDataType(), 
getValueType(), et, -1);
+                                               
getInput().get(1).constructLops(), 
ConvolutionTransform.OperationTypes.RELU_BACKWARD,
+                                               getDataType(), getValueType(), 
et, OptimizerUtils.getConstrainedNumThreads(_maxNumThreads));
                                }
                                else
                                        binary = new 
Binary(getInput().get(0).constructLops(), getInput().get(1).constructLops(), 
HopsOpOp2LopsB.get(op),
@@ -1550,13 +1548,13 @@ public class BinaryOp extends Hop
                                        setNnz( lnnz1 );
                                }
                        }
-               }       
+               }
        }
        
        @Override
        public Object clone() throws CloneNotSupportedException 
        {
-               BinaryOp ret = new BinaryOp();  
+               BinaryOp ret = new BinaryOp();
                
                //copy generic attributes
                ret.clone(this, false);
@@ -1564,6 +1562,7 @@ public class BinaryOp extends Hop
                //copy specific attributes
                ret.op = op;
                ret.outer = outer;
+               ret._maxNumThreads = _maxNumThreads;
                
                return ret;
        }
@@ -1577,6 +1576,7 @@ public class BinaryOp extends Hop
                BinaryOp that2 = (BinaryOp)that;
                return (   op == that2.op
                                && outer == that2.outer
+                               && _maxNumThreads == that2._maxNumThreads
                                && getInput().get(0) == that2.getInput().get(0)
                                && getInput().get(1) == 
that2.getInput().get(1));
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 4224474..20ab041 100644
--- a/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
+++ b/src/main/java/org/apache/sysml/hops/ConvolutionOp.java
@@ -20,7 +20,6 @@
 package org.apache.sysml.hops;
 
 import org.apache.sysml.api.DMLScript;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.ConvolutionTransform;
 import org.apache.sysml.lops.ConvolutionTransform.OperationTypes;
@@ -34,8 +33,8 @@ import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
 import org.apache.sysml.runtime.matrix.data.ConvolutionParameters;
 import java.util.ArrayList;
 
-public class ConvolutionOp extends Hop  implements MultiThreadedHop
-{      
+public class ConvolutionOp extends MultiThreadedHop
+{
        // 
-------------------------------------------------------------------------
        // This flag allows us to compile plans with less unknowns and also 
serves as future tensorblock integration.
        // By default, these flags are turned on.
@@ -49,7 +48,6 @@ public class ConvolutionOp extends Hop  implements 
MultiThreadedHop
        
        // Specifies the type of this hop
        private Hop.ConvOp op;
-       private int _maxNumThreads = -1; //-1 for unlimited
 
        private ConvolutionOp() {
                //default constructor for clone
@@ -282,13 +280,14 @@ public class ConvolutionOp extends Hop  implements 
MultiThreadedHop
                }
                // 
---------------------------------------------------------------
                
-               // Contruct the lop
+               // Construct the lop
                Lop optionalMaxPoolOutput = (et == ExecType.GPU) ? 
getMaxPoolOutputLop() : null;
                Lop[] l2inputs = new Lop[inputsOfPotentiallyFusedOp.size()-1];
                for( int i=1; i < inputsOfPotentiallyFusedOp.size(); i++ )
                        l2inputs[i-1] = 
inputsOfPotentiallyFusedOp.get(i).constructLops();
-               ConvolutionTransform convolutionLop = new 
ConvolutionTransform(lhsInputLop, lopOp,
-                               getDataType(), getValueType(), et, 
OptimizerUtils.getConstrainedNumThreads(_maxNumThreads), 
intermediateMemEstimate);
+               ConvolutionTransform convolutionLop = new ConvolutionTransform(
+                       lhsInputLop, lopOp, getDataType(), getValueType(), et,
+                       
OptimizerUtils.getConstrainedNumThreads(_maxNumThreads), 
intermediateMemEstimate);
                setOutputDimensions(convolutionLop);
                setLineNumbers(convolutionLop);
                
@@ -800,17 +799,6 @@ public class ConvolutionOp extends Hop  implements 
MultiThreadedHop
                
                return ret;
        }
-
-       @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
        
        // 
------------------------------------------------------------------------------------------------------
        // Utility methods to get the dimensions taking into account unknown 
dimensions

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 3101721..9e59235 100644
--- a/src/main/java/org/apache/sysml/hops/DataGenOp.java
+++ b/src/main/java/org/apache/sysml/hops/DataGenOp.java
@@ -26,7 +26,6 @@ import java.util.Map.Entry;
 import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.lops.Lop;
 import org.apache.sysml.lops.DataGen;
 import org.apache.sysml.lops.LopProperties.ExecType;
@@ -42,13 +41,12 @@ import org.apache.sysml.runtime.util.UtilFunctions;
  * A DataGenOp can be rand (or matrix constructor), sequence, and sample -
  * these operators have different parameters and use a map of parameter type 
to hop position.
  */
-public class DataGenOp extends Hop implements MultiThreadedHop
+public class DataGenOp extends MultiThreadedHop
 {
        public static final long UNSPECIFIED_SEED = -1;
        
         // defines the specific data generation method
        private DataGenMethod _op;
-       private int _maxNumThreads = -1; //-1 for unlimited
        
        /**
         * List of "named" input parameters. They are maintained as a hashmap:
@@ -134,16 +132,6 @@ public class DataGenOp extends Hop implements 
MultiThreadedHop
        }
        
        @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
-       @Override
        public boolean isGPUEnabled() {
                return false;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 bfff50a..563c693 100644
--- a/src/main/java/org/apache/sysml/hops/Hop.java
+++ b/src/main/java/org/apache/sysml/hops/Hop.java
@@ -64,14 +64,6 @@ public abstract class Hop implements ParseInfo
        
        public static final long CPThreshold = 2000;
 
-       /**
-        * Optional hop interface, to be implemented by multi-threaded hops.
-        */
-       public interface MultiThreadedHop {
-               public abstract void setMaxNumThreads( int k );
-               public abstract int getMaxNumThreads();
-       }
-
        // static variable to assign an unique ID to every hop that is created
        private static IDSequence _seqHopID = new IDSequence();
        

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/hops/MultiThreadedHop.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/MultiThreadedHop.java 
b/src/main/java/org/apache/sysml/hops/MultiThreadedHop.java
new file mode 100644
index 0000000..21f7feb
--- /dev/null
+++ b/src/main/java/org/apache/sysml/hops/MultiThreadedHop.java
@@ -0,0 +1,47 @@
+/*
+ * 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.hops;
+
+import org.apache.sysml.parser.Expression.DataType;
+import org.apache.sysml.parser.Expression.ValueType;
+
+/**
+ * Optional hop interface, to be implemented by multi-threaded hops.
+ */
+public abstract class MultiThreadedHop extends Hop
+{
+       protected int _maxNumThreads = -1; //-1 for unlimited
+       
+       public MultiThreadedHop() {
+               
+       }
+       
+       public MultiThreadedHop(String name, DataType dt, ValueType vt) {
+               super(name, dt, vt);
+       }
+       
+       public final void setMaxNumThreads( int k ) {
+               _maxNumThreads = k;
+       }
+       
+       public final int getMaxNumThreads() {
+               return _maxNumThreads;
+       }
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 82e9f12..af2eae3 100644
--- a/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
+++ b/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
@@ -23,7 +23,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map.Entry;
 
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.AppendR;
@@ -51,15 +50,13 @@ import org.apache.sysml.runtime.util.UtilFunctions;
  * Defines the HOP for calling an internal function (with custom parameters) 
from a DML script. 
  * 
  */
-public class ParameterizedBuiltinOp extends Hop implements MultiThreadedHop
+public class ParameterizedBuiltinOp extends MultiThreadedHop
 {
        public static boolean FORCE_DIST_RM_EMPTY = false;
 
        //operator type
        private ParamBuiltinOp _op;
 
-       private int _maxNumThreads = -1; //-1 for unlimited
-       
        //removeEmpty hints
        private boolean _outputPermutationMatrix = false;
        private boolean _bRmEmptyBC = false;
@@ -141,16 +138,6 @@ public class ParameterizedBuiltinOp extends Hop implements 
MultiThreadedHop
        }
        
        @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
-       @Override
        public boolean isGPUEnabled() {
                return false;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 90cfc98..60d35f8 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.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.DataPartition;
 import org.apache.sysml.lops.Group;
@@ -57,13 +56,12 @@ import 
org.apache.sysml.runtime.matrix.mapred.DistributedCacheInput;
  * Note: this hop should be called AggQuaternaryOp in consistency with 
AggUnaryOp and AggBinaryOp;
  * however, since there does not exist a real QuaternaryOp yet - we can leave 
it as is for now. 
  */
-public class QuaternaryOp extends Hop implements MultiThreadedHop
+public class QuaternaryOp extends MultiThreadedHop
 {
        //config influencing mr operator selection (for testing purposes only) 
        public static boolean FORCE_REPLICATION = false;
        
        private OpOp4 _op = null;
-       private int _maxNumThreads = -1; //-1 for unlimited
        
        //wsloss-specific attributes
        private boolean _postWeights = false;
@@ -178,16 +176,6 @@ public class QuaternaryOp extends Hop implements 
MultiThreadedHop
        }
 
        @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
-       @Override
        public boolean isGPUEnabled() {
                return false;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 d01ed09..22867c2 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.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.rewrite.HopRewriteUtils;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.Group;
@@ -48,12 +47,11 @@ import 
org.apache.sysml.runtime.matrix.MatrixCharacteristics;
  *  and (2) most importantly semantic of reshape is exactly a reorg op. 
  */
 
-public class ReorgOp extends Hop implements MultiThreadedHop
+public class ReorgOp extends MultiThreadedHop
 {
        public static boolean FORCE_DIST_SORT_INDEXES = false;
        
        private ReOrgOp op;
-       private int _maxNumThreads = -1; //-1 for unlimited
        
        private ReorgOp() {
                //default constructor for clone
@@ -103,16 +101,6 @@ public class ReorgOp extends Hop implements 
MultiThreadedHop
                }
        }
 
-       @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
        public ReOrgOp getOp()
        {
                return op;

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/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 46a5f8e..fedc557 100644
--- a/src/main/java/org/apache/sysml/hops/UnaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/UnaryOp.java
@@ -22,7 +22,6 @@ package org.apache.sysml.hops;
 import java.util.ArrayList;
 
 import org.apache.sysml.api.DMLScript;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.lops.Aggregate;
 import org.apache.sysml.lops.Aggregate.OperationTypes;
 import org.apache.sysml.lops.CombineUnary;
@@ -48,13 +47,10 @@ import 
org.apache.sysml.runtime.matrix.MatrixCharacteristics;
  *             Semantic: given a value, perform the operation (independent of 
other values)
  */
 
-public class UnaryOp extends Hop implements MultiThreadedHop
+public class UnaryOp extends MultiThreadedHop
 {
        private OpOp1 _op = null;
        
-       private int _maxNumThreads = -1; //-1 for unlimited
-       
-       
        private UnaryOp() {
                //default constructor for clone
        }
@@ -88,16 +84,6 @@ public class UnaryOp extends Hop implements MultiThreadedHop
        }
 
        @Override
-       public void setMaxNumThreads( int k ) {
-               _maxNumThreads = k;
-       }
-       
-       @Override
-       public int getMaxNumThreads() {
-               return _maxNumThreads;
-       }
-       
-       @Override
        public boolean isGPUEnabled() {
                if(!DMLScript.USE_ACCELERATOR)
                        return false;

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/hops/codegen/SpoofFusedOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/SpoofFusedOp.java 
b/src/main/java/org/apache/sysml/hops/codegen/SpoofFusedOp.java
index 07e71a9..a25ed0c 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/SpoofFusedOp.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/SpoofFusedOp.java
@@ -22,8 +22,8 @@ package org.apache.sysml.hops.codegen;
 import java.util.ArrayList;
 
 import org.apache.sysml.hops.Hop;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
 import org.apache.sysml.hops.MemoTable;
+import org.apache.sysml.hops.MultiThreadedHop;
 import org.apache.sysml.hops.OptimizerUtils;
 import org.apache.sysml.lops.Lop;
 import org.apache.sysml.lops.LopProperties.ExecType;
@@ -33,7 +33,7 @@ import org.apache.sysml.parser.Expression.ValueType;
 import org.apache.sysml.runtime.codegen.SpoofRowwise;
 import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
 
-public class SpoofFusedOp extends Hop implements MultiThreadedHop
+public class SpoofFusedOp extends MultiThreadedHop
 {
        public enum SpoofOutputDimsType {
                INPUT_DIMS,
@@ -52,7 +52,6 @@ public class SpoofFusedOp extends Hop implements 
MultiThreadedHop
        
        private Class<?> _class = null;
        private boolean _distSupported = false;
-       private int _numThreads = -1;
        private long _constDim2 = -1;
        private SpoofOutputDimsType _dimsType;
        
@@ -71,16 +70,6 @@ public class SpoofFusedOp extends Hop implements 
MultiThreadedHop
        public void checkArity() {}
 
        @Override
-       public void setMaxNumThreads(int k) {
-               _numThreads = k;
-       }
-
-       @Override
-       public int getMaxNumThreads() {
-               return _numThreads;
-       }
-
-       @Override
        public boolean allowsAllExecTypes() {
                return _distSupported;
        }
@@ -113,7 +102,7 @@ public class SpoofFusedOp extends Hop implements 
MultiThreadedHop
                for( Hop c : getInput() )
                        inputs.add(c.constructLops());
                
-               int k = OptimizerUtils.getConstrainedNumThreads(_numThreads);
+               int k = OptimizerUtils.getConstrainedNumThreads(_maxNumThreads);
                SpoofFused lop = new SpoofFused(inputs, getDataType(), 
getValueType(), _class, k, et);
                setOutputDimensions(lop);
                setLineNumbers(lop);
@@ -127,7 +116,7 @@ public class SpoofFusedOp extends Hop implements 
MultiThreadedHop
                
                checkAndSetForcedPlatform();
                
-               if( _etypeForced != null ) {            
+               if( _etypeForced != null ) {
                        _etype = _etypeForced;
                }
                else {
@@ -285,7 +274,7 @@ public class SpoofFusedOp extends Hop implements 
MultiThreadedHop
                //copy specific attributes
                ret._class = _class;
                ret._distSupported = _distSupported;
-               ret._numThreads = _numThreads;
+               ret._maxNumThreads = _maxNumThreads;
                ret._constDim2 = _constDim2;
                ret._dimsType = _dimsType;
                return ret;
@@ -301,7 +290,7 @@ public class SpoofFusedOp extends Hop implements 
MultiThreadedHop
                //note: class implies dims type as well
                boolean ret = ( _class.equals(that2._class)
                                && _distSupported == that2._distSupported
-                               && _numThreads == that2._numThreads
+                               && _maxNumThreads == that2._maxNumThreads
                                && _constDim2 == that2._constDim2
                                && getInput().size() == 
that2.getInput().size());
                

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/lops/ConvolutionTransform.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/lops/ConvolutionTransform.java 
b/src/main/java/org/apache/sysml/lops/ConvolutionTransform.java
index cd232d0..bccb1ea 100644
--- a/src/main/java/org/apache/sysml/lops/ConvolutionTransform.java
+++ b/src/main/java/org/apache/sysml/lops/ConvolutionTransform.java
@@ -27,8 +27,6 @@ import org.apache.sysml.parser.Expression.ValueType;
 
 public class ConvolutionTransform extends Lop
 {
-
-       
        public enum OperationTypes {
                MAX_POOL, MAX_POOL_BACKWARD, AVG_POOL, AVG_POOL_BACKWARD,
                RELU_MAX_POOLING, RELU_MAX_POOLING_BACKWARD, RELU_BACKWARD,
@@ -36,9 +34,9 @@ public class ConvolutionTransform extends Lop
                BIAS_ADD, CONV2D_BIAS_ADD, BIAS_MULTIPLY, CHANNEL_SUMS
        }
        
-       private OperationTypes operation = null;
-       private int numThreads = -1;
-       private double intermediateMemBudget = 0;
+       private OperationTypes operation;
+       private double intermediateMemBudget;
+       private final int numThreads;
        
        /**
         * Constructor when we have one input.
@@ -53,7 +51,7 @@ public class ConvolutionTransform extends Lop
         */
        public ConvolutionTransform(Lop input, 
ConvolutionTransform.OperationTypes op, DataType dt, ValueType vt, ExecType et, 
int k, double intermediateMemBudget) 
        {
-               super(Lop.Type.Transform, dt, vt);              
+               super(Lop.Type.Transform, dt, vt);
                init(input, op, dt, vt, et);
                numThreads = k;
                this.intermediateMemBudget = intermediateMemBudget;
@@ -61,7 +59,7 @@ public class ConvolutionTransform extends Lop
        
        public ConvolutionTransform(Lop input1, Lop input2, 
ConvolutionTransform.OperationTypes op, DataType dt, ValueType vt, ExecType et, 
int k) 
        {
-               super(Lop.Type.Transform, dt, vt);              
+               super(Lop.Type.Transform, dt, vt);
                init(input1, op, dt, vt, et);
                numThreads = k;
                this.addInput(input2);
@@ -71,7 +69,7 @@ public class ConvolutionTransform extends Lop
        
        public ConvolutionTransform(Lop input1, Lop input2, Lop input3, 
ConvolutionTransform.OperationTypes op, DataType dt, ValueType vt, ExecType et, 
int k) 
        {
-               super(Lop.Type.Transform, dt, vt);              
+               super(Lop.Type.Transform, dt, vt);
                init(input1, op, dt, vt, et);
                numThreads = k;
                this.addInput(input2);

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
index 4041fb5..7d8ec49 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
@@ -27,7 +27,7 @@ import java.util.Set;
 import org.apache.sysml.hops.DataOp;
 import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
+import org.apache.sysml.hops.MultiThreadedHop;
 import org.apache.sysml.hops.HopsException;
 import org.apache.sysml.hops.LiteralOp;
 import org.apache.sysml.hops.OptimizerUtils;

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
index e3fb71d..ed3b758 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
@@ -38,13 +38,14 @@ import org.apache.sysml.hops.DataOp;
 import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
 import org.apache.sysml.hops.AggBinaryOp.MMultMethod;
-import org.apache.sysml.hops.Hop.MultiThreadedHop;
+import org.apache.sysml.hops.BinaryOp;
 import org.apache.sysml.hops.Hop.ParamBuiltinOp;
 import org.apache.sysml.hops.Hop.ReOrgOp;
 import org.apache.sysml.hops.IndexingOp;
 import org.apache.sysml.hops.LeftIndexingOp;
 import org.apache.sysml.hops.LiteralOp;
 import org.apache.sysml.hops.MemoTable;
+import org.apache.sysml.hops.MultiThreadedHop;
 import org.apache.sysml.hops.OptimizerUtils;
 import org.apache.sysml.hops.ParameterizedBuiltinOp;
 import org.apache.sysml.hops.ReorgOp;
@@ -1316,7 +1317,8 @@ public class OptimizerRuleBased extends Optimizer
                                                         && 
!((UnaryOp)h).isCumulativeUnaryOperation()
                                                         && 
!((UnaryOp)h).isExpensiveUnaryOperation())
                                                && !( h instanceof ReorgOp 
//only reorgop-transpose
-                                                        && 
((ReorgOp)h).getOp() != ReOrgOp.TRANS ))
+                                                        && 
((ReorgOp)h).getOp() != ReOrgOp.TRANS )
+                                               && !( h instanceof BinaryOp && 
h.getDataType().isScalar() ) )
                                        {
                                                MultiThreadedHop mhop = 
(MultiThreadedHop) h;
                                                mhop.setMaxNumThreads(opsK); 
//set max constraint in hop

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
index 6addfe4..97d050d 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
@@ -453,6 +453,7 @@ public class ConvolutionCPInstruction extends 
UnaryCPInstruction {
        
        @Override
        public void processInstruction(ExecutionContext ec) {
+               
                if (instOpcode.equalsIgnoreCase("bias_add")) {
                        processBiasAddInstruction(ec);
                        return;

http://git-wip-us.apache.org/repos/asf/systemml/blob/fcf73079/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
index 09caa94..65a1930 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ParamservBuiltinCPInstruction.java
@@ -57,6 +57,7 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.sysml.hops.Hop;
+import org.apache.sysml.hops.MultiThreadedHop;
 import org.apache.sysml.hops.recompile.Recompiler;
 import org.apache.sysml.parser.DMLProgram;
 import org.apache.sysml.parser.DMLTranslator;
@@ -279,9 +280,9 @@ public class ParamservBuiltinCPInstruction extends 
ParameterizedBuiltinCPInstruc
                if (hop.isVisited()) {
                        return recompiled;
                }
-               if (hop instanceof Hop.MultiThreadedHop) {
+               if (hop instanceof MultiThreadedHop) {
                        // Reassign the level of parallelism
-                       Hop.MultiThreadedHop mhop = (Hop.MultiThreadedHop) hop;
+                       MultiThreadedHop mhop = (MultiThreadedHop) hop;
                        mhop.setMaxNumThreads(k);
                        recompiled = true;
                }

Reply via email to