Repository: systemml
Updated Branches:
  refs/heads/master 2c1fb20ec -> 59dfb50ea


[SYSTEMML-2491] Reduced instruction overhead (createvar,rmvar,literals)

This patch slightly improves the performance for scripts with
fine-grained updates and very small intermediates, where instruction
overheads currently dominate. In detail this includes (1) the reuse of
string builders for createvar filename construction, (2) avoidance of
stream creation during rmvar shared reference analysis, and (3) the
reuse of scalar objects for literals (avoid parsing and object
allocation).


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

Branch: refs/heads/master
Commit: 59dfb50eae9161f42af8562ec8d1885f89aece53
Parents: 2c1fb20
Author: Matthias Boehm <mboe...@gmail.com>
Authored: Tue Sep 25 13:58:42 2018 +0200
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Tue Sep 25 13:58:42 2018 +0200

----------------------------------------------------------------------
 .../runtime/controlprogram/LocalVariableMap.java      |  7 +++++--
 .../controlprogram/context/ExecutionContext.java      |  3 ++-
 .../cp/BinaryMatrixScalarCPInstruction.java           |  2 +-
 .../cp/BinaryScalarScalarCPInstruction.java           |  4 ++--
 .../sysml/runtime/instructions/cp/CPOperand.java      | 12 ++++++++++++
 .../instructions/cp/CentralMomentCPInstruction.java   |  2 +-
 .../instructions/cp/FrameIndexingCPInstruction.java   |  2 +-
 .../instructions/cp/IndexingCPInstruction.java        |  8 ++++----
 .../instructions/cp/ListIndexingCPInstruction.java    |  4 ++--
 .../instructions/cp/MatrixReshapeCPInstruction.java   |  4 ++--
 .../MultiReturnParameterizedBuiltinCPInstruction.java |  2 +-
 .../runtime/instructions/cp/ReorgCPInstruction.java   |  6 +++---
 .../instructions/cp/ScalarAppendCPInstruction.java    |  4 ++--
 .../cp/ScalarBuiltinNaryCPInstruction.java            |  2 +-
 .../instructions/cp/UnaryScalarCPInstruction.java     |  2 +-
 .../instructions/cp/VariableCPInstruction.java        | 14 ++++++++------
 16 files changed, 48 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java 
b/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java
index a4c2fef..6b241c1 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/LocalVariableMap.java
@@ -115,8 +115,11 @@ public class LocalVariableMap implements Cloneable
        }
 
        public boolean hasReferences( Data d ) {
-               return localMap.values().stream().anyMatch(e -> (e instanceof 
ListObject) ?
-                       ((ListObject)e).getData().contains(d) : e == d);
+               //perf: avoid java streams here for reduced overhead in rmvar
+               for( Data o : localMap.values() )
+                       if( o instanceof ListObject ? 
((ListObject)o).getData().contains(d) : o == d )
+                               return true;
+               return false;
        }
        
        public void setRegisteredOutputs(HashSet<String> outputs) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
 
b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
index ce53aea..f310d76 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
@@ -440,7 +440,8 @@ public class ExecutionContext {
        }
        
        public ScalarObject getScalarInput(CPOperand input) {
-               return getScalarInput(input.getName(), input.getValueType(), 
input.isLiteral());
+               return input.isLiteral() ? input.getLiteral() : 
+                       getScalarInput(input.getName(), input.getValueType(), 
false);
        }
        
        public ScalarObject getScalarInput(String name, ValueType vt, boolean 
isLiteral) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryMatrixScalarCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryMatrixScalarCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryMatrixScalarCPInstruction.java
index a9ec74e..095dd8e 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryMatrixScalarCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryMatrixScalarCPInstruction.java
@@ -38,7 +38,7 @@ public class BinaryMatrixScalarCPInstruction extends 
BinaryCPInstruction {
                CPOperand scalar = ( input1.getDataType() == DataType.MATRIX ) 
? input2 : input1;
                
                MatrixBlock inBlock = ec.getMatrixInput(mat.getName(), 
getExtendedOpcode());
-               ScalarObject constant = (ScalarObject) 
ec.getScalarInput(scalar.getName(), scalar.getValueType(), scalar.isLiteral());
+               ScalarObject constant = (ScalarObject) 
ec.getScalarInput(scalar);
 
                ScalarOperator sc_op = (ScalarOperator) _optr;
                sc_op = sc_op.setConstant(constant.getDoubleValue());

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryScalarScalarCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryScalarScalarCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryScalarScalarCPInstruction.java
index 5f7f8a7..54f4b1e 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryScalarScalarCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryScalarScalarCPInstruction.java
@@ -34,8 +34,8 @@ public class BinaryScalarScalarCPInstruction extends 
BinaryCPInstruction {
 
        @Override
        public void processInstruction(ExecutionContext ec) {
-               ScalarObject so1 = ec.getScalarInput(input1.getName(), 
input1.getValueType(), input1.isLiteral());
-               ScalarObject so2 = ec.getScalarInput(input2.getName(), 
input2.getValueType(), input2.isLiteral() );
+               ScalarObject so1 = ec.getScalarInput(input1);
+               ScalarObject so2 = ec.getScalarInput(input2);
                
                String opcode = getOpcode();
                BinaryOperator dop = (BinaryOperator) _optr;

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
index 22b79b0..b995e63 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
@@ -23,6 +23,7 @@ import org.apache.commons.lang.builder.ToStringBuilder;
 import org.apache.commons.lang.builder.ToStringStyle;
 import org.apache.sysml.parser.Expression.DataType;
 import org.apache.sysml.parser.Expression.ValueType;
+import org.apache.sysml.runtime.DMLRuntimeException;
 import org.apache.sysml.runtime.instructions.Instruction;
 
 
@@ -32,6 +33,7 @@ public class CPOperand
        private ValueType _valueType;
        private DataType _dataType;
        private boolean _isLiteral;
+       private ScalarObject _literal;
        
        public CPOperand() {
                this("", ValueType.UNKNOWN, DataType.UNKNOWN);
@@ -77,8 +79,17 @@ public class CPOperand
                return _isLiteral;
        }
        
+       public ScalarObject getLiteral() {
+               if( !_isLiteral )
+                       throw new DMLRuntimeException("CPOperand is not a 
literal.");
+               if( _literal == null )
+                       _literal = 
ScalarObjectFactory.createScalarObject(_valueType, _name);
+               return _literal;
+       }
+       
        public void setName(String name) {
                _name = name;
+               _literal = null;
        }
 
        public void split(String str){
@@ -106,6 +117,7 @@ public class CPOperand
                        _name = opr[0];
                        _valueType = ValueType.valueOf(opr[1]);
                }
+               _literal = null;
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
index 1fcb5bc..4f13f1f 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
@@ -100,7 +100,7 @@ public class CentralMomentCPInstruction extends 
AggregateUnaryCPInstruction {
                MatrixBlock matBlock = ec.getMatrixInput(input1.getName(), 
getExtendedOpcode());
 
                CPOperand scalarInput = (input3==null ? input2 : input3);
-               ScalarObject order = ec.getScalarInput(scalarInput.getName(), 
scalarInput.getValueType(), scalarInput.isLiteral()); 
+               ScalarObject order = ec.getScalarInput(scalarInput); 
                
                CMOperator cm_op = ((CMOperator)_optr); 
                if ( cm_op.getAggOpType() == AggregateOperationTypes.INVALID )

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/FrameIndexingCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/FrameIndexingCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/FrameIndexingCPInstruction.java
index bda2951..52e05b6 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/FrameIndexingCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/FrameIndexingCPInstruction.java
@@ -69,7 +69,7 @@ public final class FrameIndexingCPInstruction extends 
IndexingCPInstruction {
                        else { //FRAME<-SCALAR 
                                if(!ixrange.isScalar())
                                        throw new DMLRuntimeException("Invalid 
index range of scalar leftindexing: "+ixrange.toString()+"." );
-                               ScalarObject scalar = 
ec.getScalarInput(input2.getName(), input2.getValueType(), input2.isLiteral());
+                               ScalarObject scalar = ec.getScalarInput(input2);
                                out = new FrameBlock(lin);
                                out.set((int)ixrange.rowStart, 
(int)ixrange.colStart, scalar.getStringValue());
                        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java
index fb4732d..5150847 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java
@@ -50,10 +50,10 @@ public abstract class IndexingCPInstruction extends 
UnaryCPInstruction {
 
        protected IndexRange getIndexRange(ExecutionContext ec) {
                return new IndexRange( //rl, ru, cl, ru
-                       (int)(ec.getScalarInput(rowLower.getName(), 
rowLower.getValueType(), rowLower.isLiteral()).getLongValue()-1),
-                       (int)(ec.getScalarInput(rowUpper.getName(), 
rowUpper.getValueType(), rowUpper.isLiteral()).getLongValue()-1),
-                       (int)(ec.getScalarInput(colLower.getName(), 
colLower.getValueType(), colLower.isLiteral()).getLongValue()-1),
-                       (int)(ec.getScalarInput(colUpper.getName(), 
colUpper.getValueType(), colUpper.isLiteral()).getLongValue()-1));
+                       (int)(ec.getScalarInput(rowLower).getLongValue()-1),
+                       (int)(ec.getScalarInput(rowUpper).getLongValue()-1),
+                       (int)(ec.getScalarInput(colLower).getLongValue()-1),
+                       (int)(ec.getScalarInput(colUpper).getLongValue()-1));
        }
 
        public static IndexingCPInstruction parseInstruction ( String str ) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
index d22d9a8..9e53700 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
@@ -41,8 +41,8 @@ public final class ListIndexingCPInstruction extends 
IndexingCPInstruction {
        @Override
        public void processInstruction(ExecutionContext ec) {
                String opcode = getOpcode();
-               ScalarObject rl = ec.getScalarInput(rowLower.getName(), 
rowLower.getValueType(), rowLower.isLiteral());
-               ScalarObject ru = ec.getScalarInput(rowUpper.getName(), 
rowUpper.getValueType(), rowUpper.isLiteral());
+               ScalarObject rl = ec.getScalarInput(rowLower);
+               ScalarObject ru = ec.getScalarInput(rowUpper);
                
                //right indexing
                if( opcode.equalsIgnoreCase(RightIndex.OPCODE) ) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixReshapeCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixReshapeCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixReshapeCPInstruction.java
index cd8d5dc..1f7b053 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixReshapeCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixReshapeCPInstruction.java
@@ -60,8 +60,8 @@ public class MatrixReshapeCPInstruction extends 
UnaryCPInstruction {
        public void processInstruction(ExecutionContext ec) {
                //get inputs
                MatrixBlock in = ec.getMatrixInput(input1.getName(), 
getExtendedOpcode());
-               int rows = (int)ec.getScalarInput(_opRows.getName(), 
_opRows.getValueType(), _opRows.isLiteral()).getLongValue(); //save cast
-               int cols = (int)ec.getScalarInput(_opCols.getName(), 
_opCols.getValueType(), _opCols.isLiteral()).getLongValue(); //save cast
+               int rows = (int)ec.getScalarInput(_opRows).getLongValue(); 
//save cast
+               int cols = (int)ec.getScalarInput(_opCols).getLongValue(); 
//save cast
                BooleanObject byRow = (BooleanObject) 
ec.getScalarInput(_opByRow.getName(), ValueType.BOOLEAN, _opByRow.isLiteral());
 
                //execute operations 

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/MultiReturnParameterizedBuiltinCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MultiReturnParameterizedBuiltinCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MultiReturnParameterizedBuiltinCPInstruction.java
index 8afa9d7..9d606b2 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MultiReturnParameterizedBuiltinCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MultiReturnParameterizedBuiltinCPInstruction.java
@@ -68,7 +68,7 @@ public class MultiReturnParameterizedBuiltinCPInstruction 
extends ComputationCPI
        public void processInstruction(ExecutionContext ec) {
                //obtain and pin input frame
                FrameBlock fin = ec.getFrameInput(input1.getName());
-               String spec = ec.getScalarInput(input2.getName(), 
input2.getValueType(), input2.isLiteral()).getStringValue();
+               String spec = ec.getScalarInput(input2).getStringValue();
                String[] colnames = fin.getColumnNames(); 
                
                //execute block transform encode

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/ReorgCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ReorgCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ReorgCPInstruction.java
index 89d99b7..5eeda8a 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ReorgCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ReorgCPInstruction.java
@@ -130,9 +130,9 @@ public class ReorgCPInstruction extends UnaryCPInstruction {
                if( r_op.fn instanceof SortIndex ) {
                        //additional attributes for sort
                        int[] cols = _col.getDataType().isMatrix() ? 
DataConverter.convertToIntVector(ec.getMatrixInput(_col.getName())) :
-                               new 
int[]{(int)ec.getScalarInput(_col.getName(), _col.getValueType(), 
_col.isLiteral()).getLongValue()};
-                       boolean desc = ec.getScalarInput(_desc.getName(), 
_desc.getValueType(), _desc.isLiteral()).getBooleanValue();
-                       boolean ixret = ec.getScalarInput(_ixret.getName(), 
_ixret.getValueType(), _ixret.isLiteral()).getBooleanValue();
+                               new 
int[]{(int)ec.getScalarInput(_col).getLongValue()};
+                       boolean desc = 
ec.getScalarInput(_desc).getBooleanValue();
+                       boolean ixret = 
ec.getScalarInput(_ixret).getBooleanValue();
                        r_op = r_op.setFn(new SortIndex(cols, desc, ixret));
                }
                

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarAppendCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarAppendCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarAppendCPInstruction.java
index 85e290b..f2728f7 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarAppendCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarAppendCPInstruction.java
@@ -32,8 +32,8 @@ public final class ScalarAppendCPInstruction extends 
AppendCPInstruction {
        @Override
        public void processInstruction(ExecutionContext ec) {
                //get input strings (vars or literals)
-               ScalarObject so1 = ec.getScalarInput( input1.getName(), 
input1.getValueType(), input1.isLiteral() );
-               ScalarObject so2 = ec.getScalarInput( input2.getName(), 
input2.getValueType(), input2.isLiteral() );
+               ScalarObject so1 = ec.getScalarInput(input1);
+               ScalarObject so2 = ec.getScalarInput(input2);
                //pre-checks
                String val1 = so1.getStringValue();
                String val2 = so2.getStringValue();

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java
index 75e22c2..172351a 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java
@@ -48,7 +48,7 @@ public class ScalarBuiltinNaryCPInstruction extends 
BuiltinNaryCPInstruction {
                if( "printf".equals(getOpcode()) ) {
                        List<ScalarObject> scalarObjects = new ArrayList<>();
                        for (CPOperand input : inputs) {
-                               ScalarObject so = 
ec.getScalarInput(input.getName(), input.getValueType(), input.isLiteral());
+                               ScalarObject so = ec.getScalarInput(input);
                                scalarObjects.add(so);
                        }
 

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/UnaryScalarCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/UnaryScalarCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/UnaryScalarCPInstruction.java
index 2773084..06291ea 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/UnaryScalarCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/UnaryScalarCPInstruction.java
@@ -39,7 +39,7 @@ public class UnaryScalarCPInstruction extends 
UnaryMatrixCPInstruction {
                ScalarObject so = null;
                
                //get the scalar input 
-               so = ec.getScalarInput( input1.getName(), 
input1.getValueType(), input1.isLiteral() );
+               so = ec.getScalarInput(input1);
                
                //core execution
                if ( opcode.equalsIgnoreCase("print") ) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/59dfb50e/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
index 8e78442..007e2f0 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
@@ -101,6 +101,9 @@ public class VariableCPInstruction extends CPInstruction {
        
        private static final IDSequence _uniqueVarID = new IDSequence(true);
        private static final int CREATEVAR_FILE_NAME_VAR_POS=3;
+       private static ThreadLocal<StringBuilder> _varNameBuilders = new 
ThreadLocal<StringBuilder>() {
+               @Override protected StringBuilder initialValue() { return new 
StringBuilder(64); }
+       };
        
        private final VariableOperationCode opcode;
        private final List<CPOperand> inputs;
@@ -475,8 +478,9 @@ public class VariableCPInstruction extends CPInstruction {
                                String fname = getInput2().getName();
                                // check if unique filename needs to be 
generated
                                if( Boolean.parseBoolean(getInput3().getName()) 
) {
-                                       fname = new 
StringBuilder(fname.length()+16).append(fname)
-                                               
.append('_').append(_uniqueVarID.getNextID()).toString();
+                                       StringBuilder sb = 
_varNameBuilders.get();
+                                       fname = 
sb.append(fname).append('_').append(_uniqueVarID.getNextID()).toString();
+                                       sb.setLength(0); //reset for next use
                                }
                                MatrixObject mobj = new 
MatrixObject(getInput1().getValueType(), fname );
                                //clone meta data because it is updated on 
copy-on-write, otherwise there
@@ -591,8 +595,7 @@ public class VariableCPInstruction extends CPInstruction {
                                ec.setMatrixOutput(output.getName(), out, 
getExtendedOpcode());
                        }
                        else if( getInput1().getDataType().isScalar() ) {
-                               ScalarObject scalarInput = ec.getScalarInput(
-                                       getInput1().getName(), 
getInput1().getValueType(), getInput1().isLiteral());
+                               ScalarObject scalarInput = 
ec.getScalarInput(getInput1());
                                MatrixBlock out = new 
MatrixBlock(scalarInput.getDoubleValue());
                                ec.setMatrixOutput(output.getName(), out, 
getExtendedOpcode());
                        }
@@ -924,8 +927,7 @@ public class VariableCPInstruction extends CPInstruction {
         */
        private void writeScalarToHDFS(ExecutionContext ec, String fname) {
                try {
-                       ScalarObject scalar = 
ec.getScalarInput(getInput1().getName(), 
-                               getInput1().getValueType(), 
getInput1().isLiteral());
+                       ScalarObject scalar = ec.getScalarInput(getInput1());
                        MapReduceTool.writeObjectToHDFS(scalar.getValue(), 
fname);
                        MapReduceTool.writeScalarMetaDataFile(fname +".mtd", 
getInput1().getValueType());
 

Reply via email to