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/08/23 23:46:18 UTC

systemml git commit: [SYSTEMML-1862] Fix special case buffer pool eviction, cleanup

Repository: systemml
Updated Branches:
  refs/heads/master 65e2a46d2 -> b19f6f5a9


[SYSTEMML-1862] Fix special case buffer pool eviction, cleanup

This patch fixes a very specific special case of buffer pool eviction,
where an intermediate is exactly of the size of the buffer pool. There
was a mismatch of conditions regarding entering the eviction path, and
eviction continuation (<= vs <). In such a scenario, we would try to
evict the next entry although there are no more entries to evict and
hence run into a nosuchelement exception. 

Furthermore, this patch also cleans up the maintenance of "fine-grained
statistics" by moving it out of the lazy write buffer. 


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

Branch: refs/heads/master
Commit: b19f6f5a927989167a0892f725c28d23055d5b8e
Parents: 65e2a46
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed Aug 23 16:34:33 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Aug 23 16:34:33 2017 -0700

----------------------------------------------------------------------
 .../controlprogram/caching/CacheableData.java   | 12 ++-
 .../controlprogram/caching/LazyWriteBuffer.java | 79 +++++++++-----------
 2 files changed, 43 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/b19f6f5a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/CacheableData.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/CacheableData.java b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/CacheableData.java
index dbc8e07..d1d455d 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/CacheableData.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/CacheableData.java
@@ -634,10 +634,16 @@ public abstract class CacheableData<T extends CacheBlock> extends Data
 				//evict blob
 				String filePath = getCacheFilePathAndName();
 				try {
-					LazyWriteBuffer.writeBlock(filePath, _data, opcode);
+					long t1 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
+					
+					int numEvicted = LazyWriteBuffer.writeBlock(filePath, _data);
+					
+					if(DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS && opcode != null) {
+						long t2 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
+						GPUStatistics.maintainCPMiscTimes(opcode, CPInstruction.MISC_TIMER_RELEASE_BUFF_WRITE, t2-t1, numEvicted);
+					}
 				}
-				catch (Exception e)
-				{
+				catch (Exception e) {
 					throw new CacheException("Eviction to local path " + filePath + " ("+getVarName()+") failed.", e);
 				}
 				_requiresLocalWrite = false;

http://git-wip-us.apache.org/repos/asf/systemml/blob/b19f6f5a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
index c045961..d5214a0 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/LazyWriteBuffer.java
@@ -28,9 +28,7 @@ import java.util.concurrent.Executors;
 
 import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.runtime.controlprogram.parfor.stat.InfrastructureAnalyzer;
-import org.apache.sysml.runtime.instructions.cp.CPInstruction;
 import org.apache.sysml.runtime.util.LocalFileUtils;
-import org.apache.sysml.utils.GPUStatistics;
 
 public class LazyWriteBuffer 
 {
@@ -40,12 +38,12 @@ public class LazyWriteBuffer
 	}
 	
 	//global size limit in bytes
-	private static final long _limit; 
+	private static final long _limit;
 	
 	//current size in bytes
-	private static long _size;  
+	private static long _size;
 	
-	//eviction queue of <filename,buffer> pairs (implemented via linked hash map 
+	//eviction queue of <filename,buffer> pairs (implemented via linked hash map
 	//for (1) queue semantics and (2) constant time get/insert/delete operations)
 	private static EvictionQueue _mQueue;
 	
@@ -57,29 +55,28 @@ public class LazyWriteBuffer
 		long maxMem = InfrastructureAnalyzer.getLocalMaxMemory();
 		_limit = (long)(CacheableData.CACHING_BUFFER_SIZE * maxMem);
 	}
-
-	public static void writeBlock( String fname, CacheBlock cb, String opcode ) 
+	
+	public static int writeBlock(String fname, CacheBlock cb)
 		throws IOException
-	{	
+	{
 		//obtain basic meta data of cache block
 		long lSize = cb.isShallowSerialize() ?
 			cb.getInMemorySize() : cb.getExactSerializedSize();
 		boolean requiresWrite = (lSize > _limit        //global buffer limit
 			|| !ByteBuffer.isValidCapacity(lSize, cb)); //local buffer limit
-	
+		int numEvicted = 0;
+		
 		//handle caching/eviction if it fits in writebuffer
 		if( !requiresWrite ) 
-		{			
+		{
 			//create byte buffer handle (no block allocation yet)
 			ByteBuffer bbuff = new ByteBuffer( lSize );
-			int numEvicted = 0;
 			
-			long t1 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
 			//modify buffer pool
 			synchronized( _mQueue )
 			{
 				//evict matrices to make room (by default FIFO)
-				while( _size+lSize >= _limit )
+				while( _size+lSize > _limit && !_mQueue.isEmpty() )
 				{
 					//remove first entry from eviction queue
 					Entry<String, ByteBuffer> entry = _mQueue.removeFirst();
@@ -93,46 +90,38 @@ public class LazyWriteBuffer
 						//evict matrix
 						tmp.evictBuffer(ftmp);
 						tmp.freeMemory();
-						_size-=tmp.getSize();
+						_size -= tmp.getSize();
 						numEvicted++;
 					}
 				}
 				
-				//put placeholder into buffer pool (reserve mem) 
+				//put placeholder into buffer pool (reserve mem)
 				_mQueue.addLast(fname, bbuff);
-				_size += lSize;	
+				_size += lSize;
 			}
-			long t2 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
 			
 			//serialize matrix (outside synchronized critical path)
 			bbuff.serializeBlock(cb);
 			
 			if( DMLScript.STATISTICS ) {
-				if(DMLScript.FINEGRAINED_STATISTICS && opcode != null) {
-					long t3 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
-					GPUStatistics.maintainCPMiscTimes(opcode, CPInstruction.MISC_TIMER_RELEASE_EVICTION, t2-t1, numEvicted);
-					GPUStatistics.maintainCPMiscTimes(opcode, CPInstruction.MISC_TIMER_RELEASE_BUFF_WRITE, t3-t2, 1);
-				}
 				CacheStatistics.incrementFSBuffWrites();
 				CacheStatistics.incrementFSWrites(numEvicted);
 			}
-		}	
+		}
 		else
 		{
-			long t1 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
 			//write directly to local FS (bypass buffer if too large)
 			LocalFileUtils.writeCacheBlockToLocal(fname, cb);
 			if( DMLScript.STATISTICS ) {
-				if(DMLScript.FINEGRAINED_STATISTICS && opcode != null) {
-					long t2 = DMLScript.STATISTICS && DMLScript.FINEGRAINED_STATISTICS ? System.nanoTime() : 0;
-					GPUStatistics.maintainCPMiscTimes(opcode, CPInstruction.MISC_TIMER_RELEASE_BUFF_WRITE, t2-t1, 1);
-				}
 				CacheStatistics.incrementFSWrites();
 			}
-		}	
+			numEvicted++;
+		}
+		
+		return numEvicted;
 	}
-
-	public static void deleteBlock( String fname )
+	
+	public static void deleteBlock(String fname)
 	{
 		boolean requiresDelete = true;
 		
@@ -141,7 +130,7 @@ public class LazyWriteBuffer
 			//remove queue entry 
 			ByteBuffer ldata = _mQueue.remove(fname);
 			if( ldata != null ) {
-				_size -= ldata.getSize(); 
+				_size -= ldata.getSize();
 				requiresDelete = false;
 				ldata.freeMemory(); //cleanup
 			}
@@ -151,8 +140,8 @@ public class LazyWriteBuffer
 		if( requiresDelete )
 			_fClean.deleteFile(fname);
 	}
-
-	public static CacheBlock readBlock( String fname, boolean matrix ) 
+	
+	public static CacheBlock readBlock(String fname, boolean matrix)
 		throws IOException
 	{
 		CacheBlock cb = null;
@@ -164,7 +153,7 @@ public class LazyWriteBuffer
 			ldata = _mQueue.get(fname);
 			
 			//modify eviction order (accordingly to access)
-			if(    CacheableData.CACHING_BUFFER_POLICY == RPolicy.LRU 
+			if(    CacheableData.CACHING_BUFFER_POLICY == RPolicy.LRU
 				&& ldata != null )
 			{
 				//reinsert entry at end of eviction queue
@@ -182,7 +171,7 @@ public class LazyWriteBuffer
 		}
 		else
 		{
-			cb = LocalFileUtils.readCacheBlockFromLocal(fname, matrix); 
+			cb = LocalFileUtils.readCacheBlockFromLocal(fname, matrix);
 			if( DMLScript.STATISTICS )
 				CacheStatistics.incrementFSHits();
 		}
@@ -214,11 +203,11 @@ public class LazyWriteBuffer
 	
 	/**
 	 * Print current status of buffer pool, including all entries.
-	 * NOTE: use only for debugging or testing.  
+	 * NOTE: use only for debugging or testing.
 	 * 
 	 * @param position the position
 	 */
-	public static void printStatus( String position )
+	public static void printStatus(String position)
 	{
 		System.out.println("WRITE BUFFER STATUS ("+position+") --");
 		
@@ -241,12 +230,12 @@ public class LazyWriteBuffer
 	}
 	
 	/**
-	 * Evicts all buffer pool entries. 
+	 * Evicts all buffer pool entries.
 	 * NOTE: use only for debugging or testing.
 	 * 
 	 * @throws IOException if IOException occurs
 	 */
-	public static void forceEviction() 
+	public static void forceEviction()
 		throws IOException 
 	{
 		//evict all matrices and frames
@@ -268,7 +257,7 @@ public class LazyWriteBuffer
 	}
 	
 	/**
-	 * Extended LinkedHashMap with convenience methods for adding and removing 
+	 * Extended LinkedHashMap with convenience methods for adding and removing
 	 * last/first entries.
 	 * 
 	 */
@@ -281,7 +270,7 @@ public class LazyWriteBuffer
 			put(fname, bbuff);
 		}
 		
-		public Entry<String, ByteBuffer> removeFirst() 
+		public Entry<String, ByteBuffer> removeFirst()
 		{
 			//move iterator to first entry
 			Iterator<Entry<String, ByteBuffer>> iter = entrySet().iterator();
@@ -295,9 +284,9 @@ public class LazyWriteBuffer
 	}
 	
 	/**
-	 * File delete service for abstraction of synchronous and asynchronous 
+	 * File delete service for abstraction of synchronous and asynchronous
 	 * file cleanup on rmvar/cpvar. The threadpool for asynchronous cleanup
-	 * may increase the number of threads temporarily to the number of concurrent 
+	 * may increase the number of threads temporarily to the number of concurrent
 	 * delete tasks (which is bounded to the parfor degree of parallelism).
 	 */
 	private static class FileCleaner
@@ -334,7 +323,7 @@ public class LazyWriteBuffer
 			@Override
 			public void run() {
 				LocalFileUtils.deleteFileIfExists(_fname, true);
-			}			
+			}
 		}
 	}
 }