Repository: spark
Updated Branches:
  refs/heads/branch-1.3 a58c1afe8 -> 29836e284


[SPARK-10353] [MLLIB] (1.3 backport) BLAS gemm not scaling when beta = 0.0 for 
some subset of matrix multiplications

Apply fixes for alpha, beta parameter handling in gemm/gemv from #8525 to 
branch 1.3

CC mengxr brkyvz

Author: Sean Owen <[email protected]>

Closes #8572 from srowen/SPARK-10353.2.


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

Branch: refs/heads/branch-1.3
Commit: 29836e28456e6eaba1a1ccfd10819e1a2f23535f
Parents: a58c1af
Author: Sean Owen <[email protected]>
Authored: Wed Sep 2 13:33:24 2015 -0700
Committer: Xiangrui Meng <[email protected]>
Committed: Wed Sep 2 13:33:24 2015 -0700

----------------------------------------------------------------------
 .../scala/org/apache/spark/mllib/linalg/BLAS.scala  | 16 ++++++++++------
 .../org/apache/spark/mllib/linalg/BLASSuite.scala   |  5 +++++
 2 files changed, 15 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/spark/blob/29836e28/mllib/src/main/scala/org/apache/spark/mllib/linalg/BLAS.scala
----------------------------------------------------------------------
diff --git a/mllib/src/main/scala/org/apache/spark/mllib/linalg/BLAS.scala 
b/mllib/src/main/scala/org/apache/spark/mllib/linalg/BLAS.scala
index 5563287..ace7c06 100644
--- a/mllib/src/main/scala/org/apache/spark/mllib/linalg/BLAS.scala
+++ b/mllib/src/main/scala/org/apache/spark/mllib/linalg/BLAS.scala
@@ -305,6 +305,8 @@ private[spark] object BLAS extends Serializable with 
Logging {
       "The matrix C cannot be the product of a transpose() call. 
C.isTransposed must be false.")
     if (alpha == 0.0 && beta == 1.0) {
       logDebug("gemm: alpha is equal to 0 and beta is equal to 1. Returning 
C.")
+    } else if (alpha == 0.0) {
+      f2jBLAS.dscal(C.values.length, beta, C.values, 1)
     } else {
       A match {
         case sparse: SparseMatrix => gemm(alpha, sparse, B, beta, C)
@@ -408,8 +410,8 @@ private[spark] object BLAS extends Serializable with 
Logging {
         }
       }
     } else {
-      // Scale matrix first if `beta` is not equal to 0.0
-      if (beta != 0.0) {
+      // Scale matrix first if `beta` is not equal to 1.0
+      if (beta != 1.0) {
         f2jBLAS.dscal(C.values.length, beta, C.values, 1)
       }
       // Perform matrix multiplication and add to C. The rows of A are 
multiplied by the columns of
@@ -470,8 +472,10 @@ private[spark] object BLAS extends Serializable with 
Logging {
       s"The columns of A don't match the number of elements of x. A: 
${A.numCols}, x: ${x.size}")
     require(A.numRows == y.size,
       s"The rows of A don't match the number of elements of y. A: 
${A.numRows}, y:${y.size}}")
-    if (alpha == 0.0) {
-      logDebug("gemv: alpha is equal to 0. Returning y.")
+    if (alpha == 0.0 && beta == 1.0) {
+      logDebug("gemv: alpha is equal to 0 and beta is equal to 1. Returning 
y.")
+    } else if (alpha == 0.0) {
+      scal(beta, y)
     } else {
       A match {
         case sparse: SparseMatrix =>
@@ -534,8 +538,8 @@ private[spark] object BLAS extends Serializable with 
Logging {
         rowCounter += 1
       }
     } else {
-      // Scale vector first if `beta` is not equal to 0.0
-      if (beta != 0.0) {
+      // Scale vector first if `beta` is not equal to 1.0
+      if (beta != 1.0) {
         scal(beta, y)
       }
       // Perform matrix-vector multiplication and add to y

http://git-wip-us.apache.org/repos/asf/spark/blob/29836e28/mllib/src/test/scala/org/apache/spark/mllib/linalg/BLASSuite.scala
----------------------------------------------------------------------
diff --git a/mllib/src/test/scala/org/apache/spark/mllib/linalg/BLASSuite.scala 
b/mllib/src/test/scala/org/apache/spark/mllib/linalg/BLASSuite.scala
index 8587a54..82d3190 100644
--- a/mllib/src/test/scala/org/apache/spark/mllib/linalg/BLASSuite.scala
+++ b/mllib/src/test/scala/org/apache/spark/mllib/linalg/BLASSuite.scala
@@ -204,6 +204,7 @@ class BLASSuite extends SparkFunSuite {
     val C14 = C1.copy
     val C15 = C1.copy
     val C16 = C1.copy
+    val C17 = C1.copy
     val expected2 = new DenseMatrix(4, 2, Array(2.0, 1.0, 4.0, 2.0, 4.0, 0.0, 
4.0, 3.0))
     val expected3 = new DenseMatrix(4, 2, Array(2.0, 2.0, 4.0, 2.0, 8.0, 0.0, 
6.0, 6.0))
     val expected4 = new DenseMatrix(4, 2, Array(5.0, 0.0, 10.0, 5.0, 0.0, 0.0, 
5.0, 0.0))
@@ -217,6 +218,10 @@ class BLASSuite extends SparkFunSuite {
     assert(C2 ~== expected2 absTol 1e-15)
     assert(C3 ~== expected3 absTol 1e-15)
     assert(C4 ~== expected3 absTol 1e-15)
+    gemm(1.0, dA, B, 0.0, C17)
+    assert(C17 ~== expected absTol 1e-15)
+    gemm(1.0, sA, B, 0.0, C17)
+    assert(C17 ~== expected absTol 1e-15)
 
     withClue("columns of A don't match the rows of B") {
       intercept[Exception] {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to