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 2016/10/14 16:58:22 UTC

[2/2] incubator-systemml git commit: [SYSTEMML-1045] Fix CSR block growth rate on resize (update-in-place)

[SYSTEMML-1045] Fix CSR block growth rate on resize (update-in-place)

So far, we used an aggressive 2x growth rate for CSR sparse
representations. In comparison to MCSR, this significantly affects
temporary memory requirements as this applies to the entire matrix not
just a single row. For update-in-place left indexing, the growth is
covered by the input + output memory requirements, which are roughly 2x
the input but not 3x as required for a rate of 2x. We now use a
conservative 1.1x rate. Furthermore, this patch also cleans up some
unnecessary redundancy of the related resizing logic and fixes incorrect
size computation (for small initial capacities).

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

Branch: refs/heads/master
Commit: af7d7f05bc5e43cda129f72cb7cd4f1a2cffbb97
Parents: 3895443
Author: Matthias Boehm <mb...@gmail.com>
Authored: Thu Oct 13 20:28:06 2016 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Thu Oct 13 20:28:06 2016 -0700

----------------------------------------------------------------------
 .../runtime/matrix/data/SparseBlockCSR.java     | 27 +++++++++++---------
 1 file changed, 15 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/af7d7f05/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
index a26a834..fe1dde7 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
@@ -691,14 +691,23 @@ public class SparseBlockCSR extends SparseBlock
 	///////////////////////////
 	// private helper methods
 	
+	private int newCapacity(int minsize) {
+		//compute new size until minsize reached
+		double tmpCap = _values.length;
+		while( tmpCap < minsize ) {
+			tmpCap *= (tmpCap <= 1024) ? 
+					RESIZE_FACTOR1 : RESIZE_FACTOR2;
+		}
+			
+		return (int)Math.min(tmpCap, Integer.MAX_VALUE);
+	}
+	
 	/**
 	 * 
 	 */
 	private void resize() {
-		//compute new size
-		double tmpCap = _values.length * RESIZE_FACTOR1;
-		int newCap = (int)Math.min(tmpCap, Integer.MAX_VALUE);
-		
+		//resize by at least by 1
+		int newCap = newCapacity(_values.length+1);
 		resizeCopy(newCap);
 	}
 	
@@ -707,12 +716,7 @@ public class SparseBlockCSR extends SparseBlock
 	 * @param minsize
 	 */
 	private void resize(int minsize) {
-		//compute new size until minsize reached
-		double tmpCap = _values.length;
-		while( tmpCap < minsize )
-			tmpCap *= RESIZE_FACTOR1;
-		int newCap = (int)Math.min(tmpCap, Integer.MAX_VALUE);
-		
+		int newCap = newCapacity(minsize);
 		resizeCopy(newCap);
 	}
 	
@@ -734,8 +738,7 @@ public class SparseBlockCSR extends SparseBlock
 	 */
 	private void resizeAndInsert(int ix, int c, double v) {
 		//compute new size
-		double tmpCap = _values.length * RESIZE_FACTOR1;
-		int newCap = (int)Math.min(tmpCap, Integer.MAX_VALUE);
+		int newCap = newCapacity(_values.length+1);
 		
 		int[] oldindexes = _indexes;
 		double[] oldvalues = _values;