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:54 UTC
[2/3] systemml git commit: [SYSTEMML-1987] Fix JMLC handling of
disabled parfor (convert to for)
[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));
+ }
+}