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