You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2017/11/05 22:29:53 UTC

[1/3] systemml git commit: [MINOR] Performance shallow reshape and sparse cbind operations

Repository: systemml
Updated Branches:
  refs/heads/master c0b6ef5ca -> f7fe43420


[MINOR] Performance shallow reshape and sparse cbind operations

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

Branch: refs/heads/master
Commit: 55c4c0b9737ad18356758e31957b8030a9aa8138
Parents: c0b6ef5
Author: Matthias Boehm <mb...@gmail.com>
Authored: Sat Nov 4 21:23:57 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sat Nov 4 21:23:57 2017 -0700

----------------------------------------------------------------------
 .../runtime/matrix/data/LibMatrixReorg.java     | 12 ++--
 .../sysml/runtime/matrix/data/MatrixBlock.java  | 59 +++++++++++---------
 2 files changed, 41 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/55c4c0b9/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
index dd86c27..28c3bf6 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixReorg.java
@@ -445,21 +445,25 @@ public class LibMatrixReorg
 		
 		//check for same dimensions
 		if( rlen==rows && clen == cols ) {
-			out.copy(in); //incl dims, nnz
+			//copy incl dims, nnz
+			if( SHALLOW_COPY_REORG )
+				out.copyShallow(in);
+			else
+				out.copy(in); 
 			return out;
 		}
 	
 		//determine output representation
-	    out.sparse = MatrixBlock.evalSparseFormatInMemory(rows, cols, in.nonZeros);
+		out.sparse = MatrixBlock.evalSparseFormatInMemory(rows, cols, in.nonZeros);
 		
 		//set output dimensions
 		out.rlen = rows;
 		out.clen = cols;
 		out.nonZeros = in.nonZeros;
 		
-		//core reshape (sparse or dense)	
+		//core reshape (sparse or dense)
 		if(!in.sparse && !out.sparse)
-			reshapeDense(in, out, rows, cols, rowwise);		
+			reshapeDense(in, out, rows, cols, rowwise);
 		else if(in.sparse && out.sparse)
 			reshapeSparse(in, out, rows, cols, rowwise);
 		else if(in.sparse)

http://git-wip-us.apache.org/repos/asf/systemml/blob/55c4c0b9/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
index 48051de..88efde2 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
@@ -761,19 +761,17 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 		}
 		else //SPARSE <- DENSE
 		{
-			for( int i=0; i<that.rlen; i++ )
-			{
-				int aix = rowoffset+i;
-				for( int j=0, bix=i*that.clen; j<that.clen; j++ )
-				{
-					double val = that.denseBlock[bix+j];
-					if( val != 0 ) {
-						//create sparserow only if required
-						sparseBlock.allocate(aix, estimatedNNzsPerRow,clen);
-						sparseBlock.append(aix, coloffset+j, val);
+			double[] b = that.denseBlock;
+			final int bm = that.rlen;
+			final int bn = that.clen;
+			for( int i=0, aix=rowoffset, bix=0; i<bm; i++, aix++, bix+=bn )
+				for( int j=0; j<bn; j++ ) {
+					final double bval = b[bix+j];
+					if( bval != 0 ) {
+						sparseBlock.allocate(aix, estimatedNNzsPerRow, clen);
+						sparseBlock.append(aix, coloffset+j, bval);
 					}
 				}
-			}
 		}
 	}
 	
@@ -1351,6 +1349,17 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 			copyDenseToDense(that);
 	}
 	
+	public void copyShallow(MatrixBlock that) {
+		rlen = that.rlen;
+		clen = that.clen;
+		nonZeros = that.nonZeros;
+		sparse = that.sparse;
+		if( !sparse )
+			denseBlock = that.denseBlock;
+		else
+			sparseBlock = that.sparseBlock;
+	}
+	
 	private void copySparseToSparse(MatrixBlock that)
 	{
 		this.nonZeros=that.nonZeros;
@@ -1697,7 +1706,7 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 	
 	private void copyEmptyToDense(int rl, int ru, int cl, int cu)
 	{
-		int rowLen = cu-cl+1;				
+		int rowLen = cu-cl+1;
 		if(clen == rowLen) //optimization for equal width
 			Arrays.fill(denseBlock, rl*clen+cl, ru*clen+cu+1, 0);
 		else
@@ -3546,7 +3555,7 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 		
 		//core append operation
 		//copy left and right input into output
-		if( !result.sparse ) //DENSE
+		if( !result.sparse && nnz!=0 ) //DENSE
 		{
 			if( cbind ) {
 				result.copy(0, m-1, 0, clen-1, this, false);
@@ -3563,20 +3572,18 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 				}
 			}
 		}
-		else //SPARSE
+		else if(nnz != 0) //SPARSE
 		{
 			//adjust sparse rows if required
-			if( !this.isEmptyBlock(false) || !Arrays.stream(that).allMatch(mb -> mb.isEmptyBlock(false)) ) {
-				result.allocateSparseRowsBlock();
-				//allocate sparse rows once for cbind
-				if( cbind && result.getSparseBlock() instanceof SparseBlockMCSR ) {
-					SparseBlock sblock = result.getSparseBlock();
-					for( int i=0; i<result.rlen; i++ ) {
-						final int row = i; //workaround for lambda compile issue
-						int lnnz = (int) (this.recomputeNonZeros(i, i, 0, this.clen-1) + Arrays.stream(that)
-							.mapToLong(mb -> mb.recomputeNonZeros(row, row, 0, mb.clen-1)).sum());
-						sblock.allocate(i, lnnz);
-					}
+			result.allocateSparseRowsBlock();
+			//allocate sparse rows once for cbind
+			if( cbind && nnz > rlen && result.getSparseBlock() instanceof SparseBlockMCSR ) {
+				SparseBlock sblock = result.getSparseBlock();
+				for( int i=0; i<result.rlen; i++ ) {
+					final int row = i; //workaround for lambda compile issue
+					int lnnz = (int) (this.recomputeNonZeros(i, i, 0, this.clen-1) + Arrays.stream(that)
+						.mapToLong(mb -> mb.recomputeNonZeros(row, row, 0, mb.clen-1)).sum());
+					sblock.allocate(i, lnnz);
 				}
 			}
 			
@@ -3600,7 +3607,7 @@ public class MatrixBlock extends MatrixValue implements CacheBlock, Externalizab
 		result.nonZeros = nnz;
 		return result;
 	}
-
+	
 	public MatrixBlock transposeSelfMatrixMultOperations( MatrixBlock out, MMTSJType tstype )
 		throws DMLRuntimeException 
 	{


[2/3] systemml git commit: [SYSTEMML-1987] Fix JMLC handling of disabled parfor (convert to for)

Posted by mb...@apache.org.
[SYSTEMML-1987] Fix JMLC handling of disabled parfor (convert to for)

This patch makes a minor improvement to the compilation of parfor loops.
JMLC allows to disable parfor (for environments w/ concurrent execution
of prepared scripts) - so far we simply forced a parallel degree of 1.
This led to unnecessary problems, because the optimizer still tries to
access the cluster status and configuration, which can cause unnecessary
problems in non-hadoop environments. We now simply convert parfor to for
during runtime program construction.


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

Branch: refs/heads/master
Commit: e888cce89c6fce0f3a2e055dfa5a13efbd103c17
Parents: 55c4c0b
Author: Matthias Boehm <mb...@gmail.com>
Authored: Sat Nov 4 22:38:20 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sun Nov 5 14:27:20 2017 -0800

----------------------------------------------------------------------
 .../org/apache/sysml/parser/DMLTranslator.java  |  2 +-
 .../jmlc/JMLCParfor2ForCompileTest.java         | 77 ++++++++++++++++++++
 2 files changed, 78 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/e888cce8/src/main/java/org/apache/sysml/parser/DMLTranslator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/DMLTranslator.java b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
index 0d466e2..5a7f60e 100644
--- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
@@ -613,7 +613,7 @@ public class DMLTranslator
 			ForProgramBlock rtpb = null;
 			IterablePredicate iterPred = fsb.getIterPredicate();
 			
-			if( sb instanceof ParForStatementBlock ) {
+			if( sb instanceof ParForStatementBlock && ConfigurationManager.isParallelParFor() ) {
 				sbName = "ParForStatementBlock";
 				rtpb = new ParForProgramBlock(prog, iterPred.getIterVar().getName(),
 					iterPred.getParForParams(), ((ParForStatementBlock)sb).getResultVariables());

http://git-wip-us.apache.org/repos/asf/systemml/blob/e888cce8/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCParfor2ForCompileTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCParfor2ForCompileTest.java b/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCParfor2ForCompileTest.java
new file mode 100644
index 0000000..e806f0c
--- /dev/null
+++ b/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCParfor2ForCompileTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.test.integration.functions.jmlc;
+
+import java.io.IOException;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.sysml.api.DMLScript;
+import org.apache.sysml.api.jmlc.Connection;
+import org.apache.sysml.api.jmlc.PreparedScript;
+import org.apache.sysml.conf.CompilerConfig.ConfigType;
+import org.apache.sysml.test.integration.AutomatedTestBase;
+import org.apache.sysml.utils.Statistics;
+
+public class JMLCParfor2ForCompileTest extends AutomatedTestBase 
+{
+	@Override
+	public void setUp() {
+		//do nothing
+	}
+	
+	@Test
+	public void testParfor2ParforCompile() throws IOException {
+		runJMLCParFor2ForTest(true);
+	}
+	
+	@Test
+	public void testParfor2ForCompile() throws IOException {
+		runJMLCParFor2ForTest(false);
+	}
+
+	private void runJMLCParFor2ForTest(boolean par) 
+		throws IOException
+	{
+		try {
+			Connection conn = !par ? new Connection() :
+				new Connection(ConfigType.PARALLEL_LOCAL_OR_REMOTE_PARFOR);
+			String script =
+				"  X = rand(rows=10, cols=10);"
+				+ "R = matrix(0, rows=10, cols=1)"
+				+ "parfor(i in 1:nrow(X))"
+				+ "  R[i,] = sum(X[i,])"
+				+ "print(sum(R))";
+			DMLScript.STATISTICS = true;
+			Statistics.reset();
+		
+			PreparedScript pscript = conn.prepareScript(
+				script, new String[]{}, new String[]{}, false);
+			pscript.executeScript();
+			conn.close();
+		}
+		catch(Exception ex) {
+			Assert.fail("JMLC parfor test failed: "+ex.getMessage());
+		}
+		
+		//check for existing or non-existing parfor
+		Assert.assertTrue(Statistics.getParforOptCount()==(par?1:0));
+	}
+}


[3/3] systemml git commit: [SYSTEMML-1988] JMLC API extension for cloning prepared scripts

Posted by mb...@apache.org.
[SYSTEMML-1988] JMLC API extension for cloning prepared scripts 

In complex applications and micro services, the need to reuse prepared
scripts in a thread-local manner in order to amortize the compilation
overhead, creates sometimes an unnecessary burden. Without dynamic
recompilation, this is unnecessary because a single compiled program can
be shared across concurrent invocations of PreparedScript.execute. This
patch extends the JMLC API by cloning functionality, which allows to
statically initialize a single prepared script and create cheap shallow
copies of the script's program and meta data.


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

Branch: refs/heads/master
Commit: f7fe4342005ec0da383f359b70fbab48a25dff7a
Parents: e888cce
Author: Matthias Boehm <mb...@gmail.com>
Authored: Sat Nov 4 23:33:43 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sun Nov 5 14:27:44 2017 -0800

----------------------------------------------------------------------
 .../org/apache/sysml/api/jmlc/Connection.java   |  15 +++
 .../apache/sysml/api/jmlc/PreparedScript.java   |  37 ++++++
 .../jmlc/JMLCClonedPreparedScriptTest.java      | 113 +++++++++++++++++++
 .../functions/jmlc/ZPackageSuite.java           |   2 +
 4 files changed, 167 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/f7fe4342/src/main/java/org/apache/sysml/api/jmlc/Connection.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/jmlc/Connection.java b/src/main/java/org/apache/sysml/api/jmlc/Connection.java
index e96e0aa..2568977 100644
--- a/src/main/java/org/apache/sysml/api/jmlc/Connection.java
+++ b/src/main/java/org/apache/sysml/api/jmlc/Connection.java
@@ -161,6 +161,21 @@ public class Connection implements Closeable
 	 * @param script string representing the DML or PyDML script
 	 * @param inputs string array of input variables to register
 	 * @param outputs string array of output variables to register
+	 * @return PreparedScript object representing the precompiled script
+	 * @throws DMLException if DMLException occurs
+	 */
+	public PreparedScript prepareScript( String script, String[] inputs, String[] outputs) 
+		throws DMLException 
+	{
+		return prepareScript(script, inputs, outputs, false);
+	}
+	
+	/**
+	 * Prepares (precompiles) a script and registers input and output variables.
+	 * 
+	 * @param script string representing the DML or PyDML script
+	 * @param inputs string array of input variables to register
+	 * @param outputs string array of output variables to register
 	 * @param parsePyDML {@code true} if PyDML, {@code false} if DML
 	 * @return PreparedScript object representing the precompiled script
 	 * @throws DMLException if DMLException occurs

http://git-wip-us.apache.org/repos/asf/systemml/blob/f7fe4342/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java b/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
index c712bb2..c23ef92 100644
--- a/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
+++ b/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
@@ -23,7 +23,9 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map.Entry;
 
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.sysml.api.DMLException;
@@ -75,6 +77,21 @@ public class PreparedScript
 	private final DMLConfig _dmlconf;
 	private final CompilerConfig _cconf;
 	
+	private PreparedScript(PreparedScript that) {
+		//shallow copy, except for a separate symbol table
+		//and related meta data of reused inputs
+		_prog = that._prog;
+		_vars = new LocalVariableMap();
+		for(Entry<String, Data> e : that._vars.entrySet())
+			_vars.put(e.getKey(), e.getValue());
+		_vars.setRegisteredOutputs(that._outVarnames);
+		_inVarnames = that._inVarnames;
+		_outVarnames = that._outVarnames;
+		_inVarReuse = new HashMap<>(that._inVarReuse);
+		_dmlconf = that._dmlconf;
+		_cconf = that._cconf;
+	}
+	
 	/**
 	 * Meant to be invoked only from Connection.
 	 * 
@@ -481,4 +498,24 @@ public class PreparedScript
 			}
 		}
 	}
+	
+	/**
+	 * Creates a cloned instance of the prepared script, which
+	 * allows for concurrent execution without side effects.
+	 * 
+	 * @param deep indicator if a deep copy needs to be created;
+	 *   if false, only a shallow (i.e., by reference) copy of the 
+	 *   program and read-only meta data is created. 
+	 * @return an equivalent prepared script
+	 */
+	public PreparedScript clone(boolean deep) {
+		if( deep )
+			throw new NotImplementedException();
+		return new PreparedScript(this);
+	}
+	
+	@Override
+	public Object clone() {
+		return clone(true);
+	}
 }

http://git-wip-us.apache.org/repos/asf/systemml/blob/f7fe4342/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCClonedPreparedScriptTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCClonedPreparedScriptTest.java b/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCClonedPreparedScriptTest.java
new file mode 100644
index 0000000..d0667e0
--- /dev/null
+++ b/src/test/java/org/apache/sysml/test/integration/functions/jmlc/JMLCClonedPreparedScriptTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.test.integration.functions.jmlc;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.apache.sysml.api.DMLException;
+import org.apache.sysml.api.DMLScript;
+import org.apache.sysml.api.jmlc.Connection;
+import org.apache.sysml.api.jmlc.PreparedScript;
+import org.apache.sysml.runtime.controlprogram.parfor.stat.InfrastructureAnalyzer;
+import org.apache.sysml.test.integration.AutomatedTestBase;
+import org.apache.sysml.utils.Statistics;
+
+public class JMLCClonedPreparedScriptTest extends AutomatedTestBase 
+{
+	@Override
+	public void setUp() {
+		//do nothing
+	}
+	
+	@Test
+	public void testSinglePreparedScript128() throws IOException {
+		runJMLCClonedTest(128, false);
+	}
+	
+	@Test
+	public void testClonedPreparedScript128() throws IOException {
+		runJMLCClonedTest(128, true);
+	}
+
+	private void runJMLCClonedTest(int num, boolean clone) 
+		throws IOException
+	{
+		int k = InfrastructureAnalyzer.getLocalParallelism();
+		
+		boolean failed = false;
+		try( Connection conn = new Connection() ) {
+			String script =
+				"  X = matrix(7, 10, 10);"
+				+ "R = matrix(0, 10, 1)"
+				+ "parfor(i in 1:nrow(X))"
+				+ "  R[i,] = sum(X[i,])"
+				+ "out = sum(R)"
+				+ "write(out, 'tmp/out')";
+			DMLScript.STATISTICS = true;
+			Statistics.reset();
+			PreparedScript pscript = conn.prepareScript(
+				script, new String[]{}, new String[]{"out"}, false);
+			
+			ExecutorService pool = Executors.newFixedThreadPool(k);
+			ArrayList<JMLCTask> tasks = new ArrayList<>();
+			for(int i=0; i<num; i++)
+				tasks.add(new JMLCTask(pscript, clone));
+			List<Future<Double>> taskrets = pool.invokeAll(tasks);
+			for(Future<Double> ret : taskrets)
+				if( ret.get() != 700 )
+					throw new RuntimeException("wrong results: "+ret.get());
+			pool.shutdown();
+		}
+		catch(Exception ex) {
+			failed = true;
+		}
+		
+		//check expected failure
+		Assert.assertTrue(failed==!clone || k==1);
+	}
+	
+	private static class JMLCTask implements Callable<Double> 
+	{
+		private final PreparedScript _pscript;
+		private final boolean _clone;
+		
+		protected JMLCTask(PreparedScript pscript, boolean clone) {
+			_pscript = pscript;
+			_clone = clone;
+		}
+		
+		@Override
+		public Double call() throws DMLException
+		{
+			if( _clone )
+				return _pscript.clone(false).executeScript().getDouble("out");
+			else
+				return _pscript.executeScript().getDouble("out");
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/f7fe4342/src/test_suites/java/org/apache/sysml/test/integration/functions/jmlc/ZPackageSuite.java
----------------------------------------------------------------------
diff --git a/src/test_suites/java/org/apache/sysml/test/integration/functions/jmlc/ZPackageSuite.java b/src/test_suites/java/org/apache/sysml/test/integration/functions/jmlc/ZPackageSuite.java
index 3d5c13a..05fa8bc 100644
--- a/src/test_suites/java/org/apache/sysml/test/integration/functions/jmlc/ZPackageSuite.java
+++ b/src/test_suites/java/org/apache/sysml/test/integration/functions/jmlc/ZPackageSuite.java
@@ -34,8 +34,10 @@ import org.junit.runners.Suite;
 	FrameLeftIndexingTest.class,
 	FrameReadMetaTest.class,
 	FrameTransformTest.class,
+	JMLCClonedPreparedScriptTest.class,
 	JMLCInputOutputTest.class,
 	JMLCInputStreamReadTest.class,
+	JMLCParfor2ForCompileTest.class,
 	ReuseModelVariablesTest.class,
 	MulticlassSVMScoreTest.class
 })