You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by ar...@apache.org on 2020/06/21 16:38:46 UTC

[systemml] branch master updated: [MINOR] Reuse rand and others, bug fixes

This is an automated email from the ASF dual-hosted git repository.

arnabp20 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemml.git


The following commit(s) were added to refs/heads/master by this push:
     new 2671a55  [MINOR] Reuse rand and others, bug fixes
2671a55 is described below

commit 2671a55fedb826a8e560401e467d372b6dc70b34
Author: arnabp <ar...@tugraz.at>
AuthorDate: Sun Jun 21 18:23:55 2020 +0200

    [MINOR] Reuse rand and others, bug fixes
    
    This patch enables reuse for rand(matrix) and few more
    instructions. Furthermore, it fixes a bug in eviction
    logic that was forming cycles in the linked lists.
---
 .../apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java | 4 ++++
 src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java   | 7 +++++--
 .../java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java  | 6 ++++--
 src/test/scripts/functions/lineage/LineageReuseAlg3.dml            | 6 +++---
 src/test/scripts/functions/lineage/RewriteTest2.dml                | 6 +++---
 5 files changed, 19 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java b/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
index 464884c..6f92b8f 100644
--- a/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
+++ b/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
@@ -172,6 +172,10 @@ public class DataGenCPInstruction extends UnaryCPInstruction {
 	public boolean isOnesCol() {
 		return minValue == maxValue && minValue == 1 && sparsity == 1 && getCols() == 1;
 	}
+
+	public boolean isMatrixCall() {
+		return minValue == maxValue && sparsity == 1;
+	}
 	
 	public long getFrom() {
 		return seq_from.isLiteral() ? UtilFunctions.parseToLong(seq_from.getName()) : -1;
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
index 1e875a4..5e56d84 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
@@ -375,6 +375,7 @@ public class LineageCache
 		if (LineageCache.probe(probeItem)) {
 			LineageCacheEntry oe = getIntern(probeItem);
 			LineageCacheEntry e = _cache.get(item);
+			boolean exists = !e.isNullVal();
 			if (oe.isMatrixValue())
 				e.setValue(oe.getMBValue(), computetime); 
 			else
@@ -386,8 +387,10 @@ public class LineageCache
 			// Add the SB/func entry to the list of items pointing to the same data.
 			// No cache size update is necessary.
 			// Maintain _origItem as head.
-			e._nextEntry = oe._nextEntry;
-			oe._nextEntry = e;
+			if (!exists) {
+				e._nextEntry = oe._nextEntry;
+				oe._nextEntry = e;
+			}
 			
 			//maintain order for eviction
 			LineageCacheEviction.addEntry(e);
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
index 48fd186..b610a96 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
@@ -24,6 +24,7 @@ import org.apache.sysds.api.DMLScript;
 import org.apache.sysds.runtime.controlprogram.context.ExecutionContext;
 import org.apache.sysds.runtime.instructions.Instruction;
 import org.apache.sysds.runtime.instructions.cp.ComputationCPInstruction;
+import org.apache.sysds.runtime.instructions.cp.DataGenCPInstruction;
 import org.apache.sysds.runtime.instructions.cp.ListIndexingCPInstruction;
 import org.apache.sysds.runtime.instructions.cp.MatrixIndexingCPInstruction;
 
@@ -38,7 +39,7 @@ public class LineageCacheConfig
 		"rightIndex", "leftIndex", "groupedagg", "r'", "solve", "spoof",
 		"uamean", "max", "min", "ifelse", "-", "sqrt", ">", "uak+", "<=",
 		"^", "uamax", "uark+", "uacmean", "eigen", "ctableexpand", "replace",
-		"^2", "uack+", "tak+*"
+		"^2", "uack+", "tak+*", "uacsqk+", "uark+"
 		//TODO: Reuse everything. 
 	};
 	private static String[] REUSE_OPCODES  = new String[] {};
@@ -152,7 +153,8 @@ public class LineageCacheConfig
 		boolean insttype = inst instanceof ComputationCPInstruction 
 			&& !(inst instanceof ListIndexingCPInstruction);
 		boolean rightop = (ArrayUtils.contains(REUSE_OPCODES, inst.getOpcode())
-			|| (inst.getOpcode().equals("append") && isVectorAppend(inst, ec)));
+			|| (inst.getOpcode().equals("append") && isVectorAppend(inst, ec))
+			|| (inst instanceof DataGenCPInstruction) && ((DataGenCPInstruction) inst).isMatrixCall());
 		boolean updateInplace = (inst instanceof MatrixIndexingCPInstruction)
 			&& ec.getMatrixObject(((ComputationCPInstruction)inst).input1).getUpdateType().isInPlace();
 		return insttype && rightop && !updateInplace;
diff --git a/src/test/scripts/functions/lineage/LineageReuseAlg3.dml b/src/test/scripts/functions/lineage/LineageReuseAlg3.dml
index 6b095cb..17e6b6d 100644
--- a/src/test/scripts/functions/lineage/LineageReuseAlg3.dml
+++ b/src/test/scripts/functions/lineage/LineageReuseAlg3.dml
@@ -23,7 +23,7 @@ findBetas = function(Matrix[double] X, Matrix[double] y)
              return (Matrix[double] all_betas)
 {
   R = matrix(0, rows=10*(ncol(X)+1), cols=5);
-  for (lamda in 20:25) {
+  for (lamda in 20:39) {
     #betas = multiLogReg(X=X, Y=y, maxii=0, verbose=FALSE);
     betas = multiLogReg(X=X, Y=y, icpt=2, tol=0.000001,
                         reg=lamda, maxi=100, maxii=0, verbose=FALSE);
@@ -36,7 +36,7 @@ findIcpt = function(Matrix[double] X, Matrix[double] y)
            return (Matrix[double] all_betas)
 {
   R = matrix(0, rows=12*(ncol(X)+2), cols=5);
-  for (lamda in 20:22) {
+  for (lamda in 20:29) {
     for (icpt in 1:2) {
       #Function level reuse of 3 out of 6 calls.
       betas = multiLogReg(X=X, Y=y, icpt=icpt, tol=0.000001,
@@ -49,7 +49,7 @@ findIcpt = function(Matrix[double] X, Matrix[double] y)
 }
 
 
-X = rand(rows=1000, cols=1000, sparsity=1.0, seed=42);
+X = rand(rows=1000, cols=100, sparsity=1.0, seed=42);
 y = rand(rows=1000, cols=1, min=0, max=6, sparsity=1.0, seed=42);
 y = floor(y);
 
diff --git a/src/test/scripts/functions/lineage/RewriteTest2.dml b/src/test/scripts/functions/lineage/RewriteTest2.dml
index 2ec31d9..f9c7e76 100644
--- a/src/test/scripts/functions/lineage/RewriteTest2.dml
+++ b/src/test/scripts/functions/lineage/RewriteTest2.dml
@@ -22,12 +22,12 @@
 X = read($1);
 
 sum = 0;
-tmp = X[,1];
+tmp = matrix(0, rows=nrow(X), cols=0);
 R = matrix(0, 1, ncol(X));
 
-for (i in 2:ncol(X)) {
-  Res1 = t(tmp) %*% tmp;
+for (i in 1:ncol(X)) {
   tmp = cbind(tmp, X[,i]);
+  Res1 = t(tmp) %*% tmp;
   while(FALSE) {}	
   R[1,i] = sum(Res1);
   sum = sum + sum(Res1);