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

mboehm7 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new 4194823  [SYSTEMDS-3340] Fix index-out-of-bounds on reading large 
dense blocks
4194823 is described below

commit 41948232c4e5d558d6bc5bccb807720e749e6527
Author: Matthias Boehm <[email protected]>
AuthorDate: Sun Mar 27 19:31:04 2022 +0200

    [SYSTEMDS-3340] Fix index-out-of-bounds on reading large dense blocks
    
    This patch fixes an issue of reading a large dense block (with multiple
    double arrays) of shape 16 x 314660480, where every small 1k x 1k block
    maps to multiple target blocks.
    
    Besides a much cleaner implementation, this patch also improves the
    performance for all FP64 combinations (small FP64 already had a special
    implementation) via array copies of contiguous rows.
---
 .../org/apache/sysds/runtime/data/DenseBlock.java  | 50 +++++++++-------------
 .../apache/sysds/runtime/data/DenseBlockBool.java  |  6 +++
 .../apache/sysds/runtime/data/DenseBlockFP32.java  |  6 +++
 .../apache/sysds/runtime/data/DenseBlockFP64.java  |  6 +++
 .../apache/sysds/runtime/data/DenseBlockInt32.java |  6 +++
 .../apache/sysds/runtime/data/DenseBlockInt64.java |  6 +++
 .../apache/sysds/runtime/data/DenseBlockLBool.java |  6 +++
 .../apache/sysds/runtime/data/DenseBlockLFP32.java |  6 +++
 .../apache/sysds/runtime/data/DenseBlockLFP64.java |  6 +++
 .../sysds/runtime/data/DenseBlockLInt32.java       |  6 +++
 .../sysds/runtime/data/DenseBlockLInt64.java       |  6 +++
 .../sysds/runtime/data/DenseBlockLString.java      |  6 +++
 .../sysds/runtime/data/DenseBlockString.java       |  6 +++
 13 files changed, 92 insertions(+), 30 deletions(-)

diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java
index 53acc47..4e836e0 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java
@@ -22,6 +22,7 @@ package org.apache.sysds.runtime.data;
 import java.io.Serializable;
 import java.util.Arrays;
 
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.instructions.cp.KahanObject;
 import org.apache.sysds.runtime.util.UtilFunctions;
@@ -225,6 +226,13 @@ public abstract class DenseBlock implements Serializable
        public abstract boolean isNumeric();
        
        /**
+        * Indicates if the dense block is a specific numeric value type.
+        * @return true if numeric and of value type vt
+        */
+       public abstract boolean isNumeric(ValueType vt);
+       
+       
+       /**
         * Indicates if the dense block has a single
         * underlying block, i.e., if numBlocks==1.
         * 
@@ -472,41 +480,23 @@ public abstract class DenseBlock implements Serializable
         * @return self
         */
        public DenseBlock set(int rl, int ru, int cl, int cu, DenseBlock db) {
-               // TODO: Optimize if dense block types match
-               // TODO: Performance
                boolean allColumns = cl == 0 && cu == _odims[0];
+               boolean FP64 = isNumeric(ValueType.FP64) && 
db.isNumeric(ValueType.FP64);
                if (db.isNumeric()) {
                        int rowOther = 0;
-                       int colOther = 0;
                        for (int bi = index(rl); bi <= index(ru-1); bi++) {
-                               int rpos = bi*blockSize();
-                               int rposl = Math.max(rl-rpos, 0);
-                               if (allColumns) {
-                                       int offset = rposl * _odims[0] + cl;
-                                       int rlen = 
Math.min(ru-Math.max(rpos,rl), blockSize(bi)-rposl);
-                                       for (int i = 0; i < rlen * _odims[0]; 
i++) {
-                                               setInternal(bi, offset + i, 
db.get(rowOther, colOther));
-                                               colOther++;
-                                               if (colOther == 
db.getCumODims(0)) {
-                                                       rowOther++;
-                                                       colOther = 0;
-                                               }
-                                       }
+                               int brl = Math.max(rl-bi*blockSize(), 0);
+                               int bru = Math.min(ru-bi*blockSize(), 
blockSize());
+                               int offset = brl * _odims[0] + cl;
+                               int clen = cu - cl;
+                               for(int r = brl; r < bru; r++, 
offset+=_odims[0], rowOther++) {
+                                       if( !FP64 )
+                                               for(int c = 0; c < clen; c++)
+                                                       setInternal(bi, offset 
+ c, db.get(rowOther, c));
+                                       else
+                                               
System.arraycopy(db.values(rowOther),
+                                                       db.pos(rowOther), 
valuesAt(bi), offset, clen);
                                }
-                               else {
-                                       int len = cu - cl;
-                                       for (int i = rl, ix1 = rl * _odims[0] + 
cl; i < ru; i++, ix1 += _odims[0]) {
-                                               for (int ix = 0; ix < len; 
ix++) {
-                                                       setInternal(bi, ix1 + 
ix, db.get(rowOther, colOther));
-                                                       colOther++;
-                                                       if (colOther == 
db.getCumODims(0)) {
-                                                               rowOther++;
-                                                               colOther = 0;
-                                                       }
-                                               }
-                                       }
-                               }
-                               rl = 0;
                        }
                }
                else {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockBool.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockBool.java
index 2461aa8..0c46c36 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockBool.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockBool.java
@@ -23,6 +23,7 @@ package org.apache.sysds.runtime.data;
 import java.util.BitSet;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -65,6 +66,11 @@ public class DenseBlockBool extends DenseBlockDRB
        }
        
        @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.BOOLEAN == vt;
+       }
+       
+       @Override
        public void reset(int rlen, int[] odims, double v) {
                boolean bv = v != 0;
                int len = rlen * odims[0];
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP32.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP32.java
index d316110..1a3bc23 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP32.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP32.java
@@ -21,6 +21,7 @@ package org.apache.sysds.runtime.data;
 
 import java.util.Arrays;
 
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.common.Warnings;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
@@ -54,6 +55,11 @@ public class DenseBlockFP32 extends DenseBlockDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.FP32 == vt;
+       }
 
        @Override
        public long capacity() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP64.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP64.java
index fbb8286..916f315 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP64.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockFP64.java
@@ -20,6 +20,7 @@
 
 package org.apache.sysds.runtime.data;
 
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.UtilFunctions;
 import org.apache.sysds.utils.MemoryEstimates;
 
@@ -52,6 +53,11 @@ public class DenseBlockFP64 extends DenseBlockDRB
        }
        
        @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.FP64 == vt;
+       }
+       
+       @Override
        public void reset(int rlen, int[] odims, double v) {
                int len = rlen * odims[0];
                if( len > capacity() ) {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt32.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt32.java
index 304df44..47e6a81 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt32.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt32.java
@@ -22,6 +22,7 @@ package org.apache.sysds.runtime.data;
 import java.util.Arrays;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -54,6 +55,11 @@ public class DenseBlockInt32 extends DenseBlockDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.INT32 == vt;
+       }
 
        @Override
        public long capacity() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt64.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt64.java
index 3c7d8d1..2be0370 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt64.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockInt64.java
@@ -22,6 +22,7 @@ package org.apache.sysds.runtime.data;
 import java.util.Arrays;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -56,6 +57,11 @@ public class DenseBlockInt64 extends DenseBlockDRB
        }
        
        @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.INT64 == vt;
+       }
+       
+       @Override
        public long capacity() {
                return (_data!=null) ? _data.length : -1;
        }
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLBool.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLBool.java
index b2cf3ad..705f894 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLBool.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLBool.java
@@ -21,6 +21,7 @@
 package org.apache.sysds.runtime.data;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -57,6 +58,11 @@ public class DenseBlockLBool extends DenseBlockLDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.BOOLEAN == vt;
+       }
 
        @Override
        public boolean isContiguous() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP32.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP32.java
index 50ddc53..753c7a8 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP32.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP32.java
@@ -20,6 +20,7 @@
 package org.apache.sysds.runtime.data;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -55,6 +56,11 @@ public class DenseBlockLFP32 extends DenseBlockLDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.FP32 == vt;
+       }
 
        @Override
        public boolean isContiguous() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP64.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP64.java
index 4634a96..2ffac04 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP64.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLFP64.java
@@ -19,6 +19,7 @@
 
 package org.apache.sysds.runtime.data;
 
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
 import java.util.Arrays;
@@ -53,6 +54,11 @@ public class DenseBlockLFP64 extends DenseBlockLDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.FP64 == vt;
+       }
 
        @Override
        public boolean isContiguous() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt32.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt32.java
index a0dc7f9..826b73b 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt32.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt32.java
@@ -21,6 +21,7 @@
 package org.apache.sysds.runtime.data;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -56,6 +57,11 @@ public class DenseBlockLInt32 extends DenseBlockLDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.INT32 == vt;
+       }
 
        @Override
        public boolean isContiguous() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt64.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt64.java
index d173248..43228b1 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt64.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLInt64.java
@@ -21,6 +21,7 @@
 package org.apache.sysds.runtime.data;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -56,6 +57,11 @@ public class DenseBlockLInt64 extends DenseBlockLDRB
        public boolean isNumeric() {
                return true;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return ValueType.INT64 == vt;
+       }
 
        @Override
        public boolean isContiguous() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLString.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLString.java
index 84ebfc6..191017a 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockLString.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockLString.java
@@ -21,6 +21,7 @@
 package org.apache.sysds.runtime.data;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -56,6 +57,11 @@ public class DenseBlockLString extends DenseBlockLDRB
        public boolean isNumeric() {
                return false;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return false;
+       }
 
        @Override
        public boolean isContiguous() {
diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlockString.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlockString.java
index 02ebd2a..2bba6a7 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlockString.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlockString.java
@@ -21,6 +21,7 @@
 package org.apache.sysds.runtime.data;
 
 import org.apache.sysds.common.Warnings;
+import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.runtime.util.DataConverter;
 import org.apache.sysds.runtime.util.UtilFunctions;
 
@@ -54,6 +55,11 @@ public class DenseBlockString extends DenseBlockDRB {
        public boolean isNumeric() {
                return false;
        }
+       
+       @Override
+       public boolean isNumeric(ValueType vt) {
+               return false;
+       }
 
        @Override
        public long capacity() {

Reply via email to