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 8af6bda559 [MINOR] Additional single-/multi-threaded tests for matmult
kernels
8af6bda559 is described below
commit 8af6bda55988af08554a8f3d215c6a09cdbea996
Author: Matthias Boehm <[email protected]>
AuthorDate: Sun Sep 22 14:00:44 2024 +0200
[MINOR] Additional single-/multi-threaded tests for matmult kernels
This patch adds dedicated components tests for all matmult kernels
(different kernels for dense-dense, dense-sparse, sparse-dense,
sparse-sparse) and checks both single- and multi-threaded
implementations because SYSTEMDS-3769 recently shown that some of these
kernels invalid parallelization strategies.
Interestingly, these tests revealed two additional bugs for
(1) dense-dense outer products, and (2) sparse-dense inner products.
Furthermore, we also fix the missing license introduced with
a recently merged PR.
---
scripts/perftest/resource/test_ops.dml | 20 +++
.../sysds/runtime/matrix/data/LibMatrixMult.java | 2 +-
.../component/matrix/MatrixMultiplyKernelTest.java | 158 +++++++++++++++++++++
3 files changed, 179 insertions(+), 1 deletion(-)
diff --git a/scripts/perftest/resource/test_ops.dml
b/scripts/perftest/resource/test_ops.dml
index 30d5a6845e..f7f48c9475 100644
--- a/scripts/perftest/resource/test_ops.dml
+++ b/scripts/perftest/resource/test_ops.dml
@@ -1,3 +1,23 @@
+#-------------------------------------------------------------
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+#-------------------------------------------------------------
X = read($X);
Y = read($Y);
diff --git
a/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixMult.java
b/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixMult.java
index 108462c567..328b43d6ca 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixMult.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixMult.java
@@ -73,7 +73,7 @@ public class LibMatrixMult
{
//internal configuration
private static final long MEM_OVERHEAD_THRESHOLD = 2L*1024*1024; //MAX
2 MB
- private static final long PAR_MINFLOP_THRESHOLD1 = 2L*1024*1024; //MIN
2 MFLOP
+ public static final long PAR_MINFLOP_THRESHOLD1 = 2L*1024*1024; //MIN 2
MFLOP
private static final long PAR_MINFLOP_THRESHOLD2 = 128L*1024; //MIN 2
MFLOP
public static final int L2_CACHESIZE = 256 * 1024; //256KB (common size)
public static final int L3_CACHESIZE = 16 * 1024 * 1024; //16MB (common
size)
diff --git
a/src/test/java/org/apache/sysds/test/component/matrix/MatrixMultiplyKernelTest.java
b/src/test/java/org/apache/sysds/test/component/matrix/MatrixMultiplyKernelTest.java
new file mode 100644
index 0000000000..9975213762
--- /dev/null
+++
b/src/test/java/org/apache/sysds/test/component/matrix/MatrixMultiplyKernelTest.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sysds.test.component.matrix;
+
+import org.apache.sysds.runtime.matrix.data.LibMatrixMult;
+import org.apache.sysds.runtime.matrix.data.MatrixBlock;
+import org.apache.sysds.test.TestUtils;
+import org.apache.sysds.utils.stats.InfrastructureAnalyzer;
+import org.junit.Test;
+
+public class MatrixMultiplyKernelTest {
+ private static final int MIN_PAR =
(int)LibMatrixMult.PAR_MINFLOP_THRESHOLD1+1;
+ private static final int MIN_PAR_SQRT = (int)Math.sqrt(MIN_PAR);
+
+ // dense-dense kernels
+
+ @Test
+ public void testDenseDenseDotProduct() {
+ testMatrixMultiply(1, MIN_PAR, 1, 1, 1);
+ }
+
+ @Test
+ public void testDenseDenseOuterProduct() {
+ testMatrixMultiply(MIN_PAR_SQRT, 1, MIN_PAR_SQRT, 1, 1);
+ }
+
+ @Test
+ public void testDenseDenseVectorScalar() {
+ testMatrixMultiply(MIN_PAR, 1, 1, 1, 1);
+ }
+
+ @Test
+ public void testDenseDenseMatrixSmallVector() {
+ testMatrixMultiply(MIN_PAR, 16, 1, 1, 1);
+ }
+
+// @Test //FIXME
+// public void testDenseDenseMatrixLargeVector() {
+// testMatrixMultiply(16, MIN_PAR, 1, 1, 1);
+// }
+
+ @Test
+ public void testDenseDenseVectorMatrix() {
+ testMatrixMultiply(1, MIN_PAR, 16, 1, 1);
+ }
+
+ @Test
+ public void testDenseDenseSmallMatrixMatrix() {
+ testMatrixMultiply(16, MIN_PAR, 16, 1, 1);
+ }
+
+ @Test
+ public void testDenseDenseMatrixSmallMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, MIN_PAR_SQRT, 4, 1, 1);
+ }
+
+ @Test
+ public void testDenseDenseMatrixMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, MIN_PAR_SQRT, MIN_PAR_SQRT, 1,
1);
+ }
+
+ // dense-sparse kernels
+
+ @Test
+ public void testDenseSparseVectorMatrix() {
+ testMatrixMultiply(1, MIN_PAR, 12, 1, 0.1);
+ }
+
+ @Test
+ public void testDenseSparseMatrixMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, MIN_PAR_SQRT, MIN_PAR_SQRT, 1,
0.1);
+ }
+
+ // sparse-dense kernels
+
+// @Test FIXME
+// public void testSparseDenseDotProduct() {
+// testMatrixMultiply(1, MIN_PAR, 1, 0.1, 1);
+// }
+
+ @Test
+ public void testSparseDenseMatrixSmallVector() {
+ testMatrixMultiply(MIN_PAR_SQRT, 1024, 1, 0.1, 1);
+ }
+
+ @Test // see SYSTEMDS-3769
+ public void testSparseDenseMatrixLargeVector() {
+ testMatrixMultiply(13, 8000, 1, 0.1, 1);
+ }
+
+ @Test
+ public void testSparseDenseVectorMatrix() {
+ testMatrixMultiply(1, MIN_PAR_SQRT, MIN_PAR_SQRT, 0.1, 1);
+ }
+
+ @Test
+ public void testSparseDenseSmallMatrixMatrix() {
+ testMatrixMultiply(9, MIN_PAR_SQRT, MIN_PAR_SQRT, 0.1, 1);
+ }
+
+ @Test
+ public void testSparseDenseMatrixSmallMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, MIN_PAR_SQRT, 9, 0.1, 1);
+ }
+
+ @Test
+ public void testSparseDenseMatrixMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, MIN_PAR_SQRT, MIN_PAR_SQRT,
0.1, 1);
+ }
+
+ // sparse-sparse kernels
+ @Test
+ public void testSparseSparseVectorMatrix() {
+ testMatrixMultiply(1, MIN_PAR_SQRT, MIN_PAR_SQRT, 0.1, 0.1);
+ }
+
+ @Test //w/ sparse output
+ public void testSparseSparseSparseMatrixMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, 2, MIN_PAR_SQRT, 0.1, 0.1);
+ }
+
+ @Test
+ public void testSparseSparseMatrixSmallMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, 15, 1000, 0.1, 0.1);
+ }
+
+ @Test
+ public void testSparseSparseMatrixMatrix() {
+ testMatrixMultiply(MIN_PAR_SQRT, MIN_PAR_SQRT, MIN_PAR_SQRT,
0.1, 0.1);
+ }
+
+ private void testMatrixMultiply(int n, int m, int l, double sp1, double
sp2) {
+ MatrixBlock mb1 = MatrixBlock.randOperations(n, m, sp1, 0, 0.1,
"uniform", 3);
+ MatrixBlock mb2 = MatrixBlock.randOperations(m, l, sp2, 0, 0.1,
"uniform", 7);
+ //run single- and multi-threaded kernels and compare
+ MatrixBlock ret1 = LibMatrixMult.matrixMult(mb1, mb2);
+ MatrixBlock ret2 = LibMatrixMult.matrixMult(mb1, mb2,
+ InfrastructureAnalyzer.getLocalParallelism());
+ TestUtils.compareMatrices(ret1, ret2, 1e-8);
+ }
+}