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/systemds.git


The following commit(s) were added to refs/heads/master by this push:
     new 6080737  [SYSTEMDS-2739] Adjust computeTime for CostNSize with ref 
counts
6080737 is described below

commit 608073796965354fcdbbd545194bc5b96c1e53d6
Author: arnabp <[email protected]>
AuthorDate: Thu Nov 12 22:23:09 2020 +0100

    [SYSTEMDS-2739] Adjust computeTime for CostNSize with ref counts
    
    This patch improves the CostNsize lineage cache eviction policy
    by adjusting the compute time of an cache entry with reference
    counts (#hits, #misses). This patch also introduces a non-recursive
    equal method for LineageItem.
---
 .../apache/sysds/runtime/lineage/LineageCache.java |  2 +-
 .../sysds/runtime/lineage/LineageCacheConfig.java  |  6 +++-
 .../sysds/runtime/lineage/LineageCacheEntry.java   | 26 +++++++++++++++
 .../runtime/lineage/LineageCacheEviction.java      | 37 +++++++++++++++-------
 .../apache/sysds/runtime/lineage/LineageItem.java  | 29 ++++++++++++++++-
 5 files changed, 85 insertions(+), 15 deletions(-)

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 71d55e3..71f01bd 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
@@ -225,7 +225,7 @@ public class LineageCache
        public static boolean probe(LineageItem key) {
                //TODO problematic as after probe the matrix might be kicked 
out of cache
                boolean p = _cache.containsKey(key);  // in cache or in disk
-               if (!p && DMLScript.STATISTICS && 
LineageCacheEviction._removelist.contains(key))
+               if (!p && DMLScript.STATISTICS && 
LineageCacheEviction._removelist.containsKey(key))
                        // The sought entry was in cache but removed later 
                        LineageCacheStatistics.incrementDelHits();
                return p;
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 20c9b67..3b8ee07 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
@@ -40,7 +40,7 @@ public class LineageCacheConfig
                "uamean", "max", "min", "ifelse", "-", "sqrt", ">", "uak+", 
"<=",
                "^", "uamax", "uark+", "uacmean", "eigen", "ctableexpand", 
"replace",
                "^2", "uack+", "tak+*", "uacsqk+", "uark+", "n+", "uarimax", 
"qsort", 
-               "qpick", "transformapply"
+               "qpick", "transformapply", "uarmax", "n+"
                //TODO: Reuse everything. 
        };
        private static String[] REUSE_OPCODES  = new String[] {};
@@ -286,6 +286,10 @@ public class LineageCacheConfig
                // Check the LRU component of weights array.
                return (WEIGHTS[1] > 0);
        }
+       
+       public static boolean isCostNsize() {
+               return (WEIGHTS[0] > 0);
+       }
 
        public static boolean isDagHeightBased() {
                // Check the DAGHEIGHT component of weights array.
diff --git 
a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java
index 00d385e..a82c8a5 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEntry.java
@@ -19,6 +19,8 @@
 
 package org.apache.sysds.runtime.lineage;
 
+import java.util.Map;
+
 import org.apache.sysds.common.Types.DataType;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.instructions.cp.ScalarObject;
@@ -138,6 +140,30 @@ public class LineageCacheEntry {
                recomputeScore();
        }
        
+       protected synchronized void computeScore(Map<LineageItem, Integer> 
removeList) {
+               setTimestamp();
+               if (removeList.containsKey(_key)) {
+                       //FIXME: increase computetime instead of score (that 
now leads to overflow).
+                       // updating computingtime seamlessly takes care of 
spilling 
+                       //_computeTime = _computeTime * (1 + 
removeList.get(_key));
+                       score = score * (1 + removeList.get(_key));
+               }
+               if (_computeTime < 0)
+                       System.out.println("after recache: "+_computeTime+" 
miss count: "+removeList.get(_key));
+       }
+       
+       protected synchronized void updateComputeTime() {
+               if ((Long.MAX_VALUE - _computeTime) < _computeTime) {
+                       System.out.println("Overflow for: "+_key.getOpcode());
+               }
+               //FIXME: increase computetime instead of score (that now leads 
to overflow).
+               // updating computingtime seamlessly takes care of spilling 
+               //_computeTime = _computeTime * (1 + removeList.get(_key));
+               //_computeTime += _computeTime;
+               //recomputeScore();
+               score *= 2;
+       }
+       
        protected synchronized long getTimestamp() {
                return _timestamp;
        }
diff --git 
a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java
index 7025818..6fc3d38 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheEviction.java
@@ -20,9 +20,8 @@
 package org.apache.sysds.runtime.lineage;
 
 import java.io.IOException;
-import java.util.HashSet;
+import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 import java.util.TreeSet;
 
 import org.apache.sysds.api.DMLScript;
@@ -37,7 +36,7 @@ public class LineageCacheEviction
        private static long _cachesize = 0;
        private static long CACHE_LIMIT; //limit in bytes
        private static long _startTimestamp = 0;
-       protected static final Set<LineageItem> _removelist = new HashSet<>();
+       protected static final Map<LineageItem, Integer> _removelist = new 
HashMap<>();
        private static String _outdir = null;
        private static TreeSet<LineageCacheEntry> weightedQueue = new 
TreeSet<>(LineageCacheConfig.LineageCacheComparator);
        
@@ -71,19 +70,27 @@ public class LineageCacheEviction
                        // Don't add the memory pinned entries in weighted 
queue. 
                        // The eviction queue should contain only entries that 
can
                        // be removed or spilled to disk.
-                       entry.setTimestamp();
+                       //entry.setTimestamp();
+                       entry.computeScore(_removelist); 
+                       // Adjust score according to cache miss counts.
                        weightedQueue.add(entry);
                }
        }
        
        protected static void getEntry(LineageCacheEntry entry) {
                // Reset the timestamp to maintain the LRU component of the 
scoring function
-               if (!LineageCacheConfig.isTimeBased()) 
-                       return;
-               
-               if (weightedQueue.remove(entry)) {
-                       entry.setTimestamp();
-                       weightedQueue.add(entry);
+               if (LineageCacheConfig.isTimeBased()) { 
+                       if (weightedQueue.remove(entry)) {
+                               entry.setTimestamp();
+                               weightedQueue.add(entry);
+                       }
+               }
+               // Increase computation time of the sought entry.
+               if (LineageCacheConfig.isCostNsize()) {
+                       if (weightedQueue.remove(entry)) {
+                               entry.updateComputeTime();
+                               weightedQueue.add(entry);
+                       }
                }
        }
 
@@ -91,8 +98,13 @@ public class LineageCacheEviction
                if (cache.remove(e._key) != null)
                        _cachesize -= e.getSize();
 
+               // Increase priority if same entry is removed multiple times
+               if (_removelist.containsKey(e._key))
+                       _removelist.replace(e._key, _removelist.get(e._key)+1);
+               else
+                       _removelist.put(e._key, 1);
+
                if (DMLScript.STATISTICS) {
-                       _removelist.add(e._key);
                        LineageCacheStatistics.incrementMemDeletes();
                }
                // NOTE: The caller of this method maintains the eviction queue.
@@ -207,10 +219,11 @@ public class LineageCacheEviction
                                removeOrSpillEntry(cache, e, false);
                                continue;
                        }
-
+                       
                        // Estimate time to write to FS + read from FS.
                        double spilltime = getDiskSpillEstimate(e) * 1000; // 
in milliseconds
                        double exectime = ((double) e._computeTime) / 1000000; 
// in milliseconds
+                       //FIXME: this comuteTime is not adjusted according to 
hit/miss counts
 
                        if (LineageCache.DEBUG) {
                                System.out.print("LI = " + e._key.getOpcode());
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageItem.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageItem.java
index e34979d..f0fcad4 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageItem.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageItem.java
@@ -178,7 +178,7 @@ public class LineageItem {
                        return false;
                
                resetVisitStatusNR();
-               boolean ret = equalsLI((LineageItem) o);
+               boolean ret = equalsLINR((LineageItem) o);
                resetVisitStatusNR();
                return ret;
        }
@@ -198,6 +198,33 @@ public class LineageItem {
                return ret;
        }
        
+       private boolean equalsLINR(LineageItem that) {
+               Stack<LineageItem> s1 = new Stack<>();
+               Stack<LineageItem> s2 = new Stack<>();
+               s1.push(this);
+               s2.push(that);
+               boolean ret = false;
+               while (!s1.empty() && !s2.empty()) {
+                       LineageItem li1 = s1.pop();
+                       LineageItem li2 = s2.pop();
+                       if (li1.isVisited() || li1 == li2)
+                               return true;
+
+                       ret = li1._opcode.equals(li2._opcode);
+                       ret &= li1._data.equals(li2._data);
+                       ret &= (li1.hashCode() == li2.hashCode());
+                       if (!ret) break;
+                       if (ret && li1._inputs != null && li1._inputs.length == 
li2._inputs.length)
+                               for (int i=0; i<li1._inputs.length; i++) {
+                                       s1.push(li1.getInputs()[i]);
+                                       s2.push(li2.getInputs()[i]);
+                               }
+                       li1.setVisited();
+               }
+               
+               return ret;
+       }
+       
        @Override
        public int hashCode() {
                if (_hash == 0) {

Reply via email to