You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mahout.apache.org by ap...@apache.org on 2017/02/26 21:36:43 UTC

mahout git commit: [MAHOUT-1903][MAHOUT-1907] VCL Vector memory copy fix. closes apache/mahout#286

Repository: mahout
Updated Branches:
  refs/heads/master 1eacd7f9d -> 0f4b3d97c


[MAHOUT-1903][MAHOUT-1907] VCL Vector memory copy fix. closes apache/mahout#286


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

Branch: refs/heads/master
Commit: 0f4b3d97cfc651a4bc052515b260648cd0093ac2
Parents: 1eacd7f
Author: Andrew Palumbo <ap...@apache.org>
Authored: Sun Feb 26 13:34:48 2017 -0800
Committer: Andrew Palumbo <ap...@apache.org>
Committed: Sun Feb 26 13:36:24 2017 -0800

----------------------------------------------------------------------
 .../viennacl/opencl/javacpp/VCLVector.scala     | 10 +--
 .../viennacl/opencl/javacpp/VectorBase.scala    |  1 +
 .../viennacl/opencl/ViennaCLSuiteVCL.scala      | 68 ++++++++++++--------
 3 files changed, 48 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mahout/blob/0f4b3d97/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VCLVector.scala
----------------------------------------------------------------------
diff --git a/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VCLVector.scala b/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VCLVector.scala
index f0e3010..3926980 100644
--- a/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VCLVector.scala
+++ b/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VCLVector.scala
@@ -112,18 +112,20 @@ final class VCLVector(defaultCtr: Boolean = true) extends VectorBase {
   @Name(Array("viennacl::vector<double>::self_type"))
   def selfType:VectorBase = this.asInstanceOf[VectorBase]
 
+  // defining this here getting a gcc compilation error when
+  // adding this method to parent class.
+  @Name(Array("switch_memory_context"))
+  @native
+  def switchMemoryContext(@ByRef ctx: Context)
 
-  @native def switch_memory_context(@ByVal context: Context): Unit
 
-//  Swaps the handles of two vectors by swapping the OpenCL handles only, no data copy.
+  //  Swaps the handles of two vectors by swapping the OpenCL handles only, no data copy.
 //  @native def fast_swap(@ByVal other: VCLVector): VectorBase
 
 // add this operator in for tests many more can be added
 //  @Name(Array("operator*"))
 //  @native @ByPtr def *(i: Int): VectorMultExpression
 
-
-
 }
 
 object VCLVector {

http://git-wip-us.apache.org/repos/asf/mahout/blob/0f4b3d97/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VectorBase.scala
----------------------------------------------------------------------
diff --git a/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VectorBase.scala b/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VectorBase.scala
index 43ae39d..9f45830 100644
--- a/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VectorBase.scala
+++ b/viennacl/src/main/scala/org/apache/mahout/viennacl/opencl/javacpp/VectorBase.scala
@@ -47,6 +47,7 @@ class VectorBase extends Pointer {
   // handle to the vec element buffer
   @native @Const @ByRef def handle: MemHandle
 
+
 //  // add this operator in for tests many more can be added
 //  @Name(Array("operator* "))
 //  @native def *(i: Int): VectorMultExpression

http://git-wip-us.apache.org/repos/asf/mahout/blob/0f4b3d97/viennacl/src/test/scala/org/apache/mahout/viennacl/opencl/ViennaCLSuiteVCL.scala
----------------------------------------------------------------------
diff --git a/viennacl/src/test/scala/org/apache/mahout/viennacl/opencl/ViennaCLSuiteVCL.scala b/viennacl/src/test/scala/org/apache/mahout/viennacl/opencl/ViennaCLSuiteVCL.scala
index c433534..2308307 100644
--- a/viennacl/src/test/scala/org/apache/mahout/viennacl/opencl/ViennaCLSuiteVCL.scala
+++ b/viennacl/src/test/scala/org/apache/mahout/viennacl/opencl/ViennaCLSuiteVCL.scala
@@ -291,11 +291,11 @@ class ViennaCLSuiteVCL extends FunSuite with Matchers {
   test("VCL Dense Matrix %*% Dense vector") {
 
     val oclCtx = new Context(Context.OPENCL_MEMORY)
-    val ompCtx = new Context(Context.MAIN_MEMORY)
+    val mainCtx = new Context(Context.MAIN_MEMORY)
 
 
-    val m = 30
-    val s = 10
+    val m = 3000
+    val s = 1000
 
     val r = new Random(1234)
 
@@ -314,32 +314,47 @@ class ViennaCLSuiteVCL extends FunSuite with Matchers {
     info(s"Mahout dense matrix %*% dense vector multiplication time: $ms ms.")
 
 
-    /* TODO: CL_OUT_OF_RESOURCES error thrown when trying to read data out of OpenCl GPU Vectors  */
-    //Test multiplication in OpenCL
-//      {
-//
-//        ms = System.currentTimeMillis()
-//        val oclA = toVclDenseRM(mxA, oclCtx)
-//        val oclVecB = toVclVec(dvecB, oclCtx)
-//
-//        val oclVecC = new VCLVector(prod(oclA, oclVecB))
-//        val oclDvecC = fromVClVec(oclVecC)
-////
-////        ms = System.currentTimeMillis() - ms
-////        info(s"ViennaCL/OpenCL dense matrix %*% dense vector multiplication time: $ms ms.")
-////        (oclDvecC.toColMatrix - mDvecC.toColMatrix).norm / s  should be < 1e-16
-//
-//        oclA.close()
-//        oclVecB.close()
-//        oclVecC.close()
-//      }
-
-    //Test multiplication in OpenMP
+    // Test mx %*% vec multiplication in OpenCL
       {
 
         ms = System.currentTimeMillis()
-        val ompMxA = toVclDenseRM(mxA, ompCtx)
-        val ompVecB = toVclVec(dvecB, ompCtx)
+
+        // we must first create vectors in main memory
+        // when working with vectors at least in ViennaCl
+        // this is the preferred method
+        val oclMxA = toVclDenseRM(mxA, mainCtx)
+        val oclVecB = toVclVec(dvecB, mainCtx)
+
+        // now copy to the OpenCL device
+        oclMxA.switchMemoryContext(oclCtx)
+        oclVecB.switchMemoryContext(oclCtx)
+
+        // perform multiplication
+        val oclVecC = new VCLVector(prod(oclMxA, oclVecB))
+
+        // copy back to main memory so that we may
+        // read values out of the result. This must be
+        // copied back to main memory VCL can not read
+        // directly from an OpenCL device
+        oclVecC.switchMemoryContext(mainCtx)
+
+        val oclDvecC = fromVClVec(oclVecC)
+
+        ms = System.currentTimeMillis() - ms
+        info(s"ViennaCL/OpenCL dense matrix %*% dense vector multiplication time: $ms ms.")
+        (oclDvecC.toColMatrix - mDvecC.toColMatrix).norm / s should be < 1e-10
+
+        oclMxA.close()
+        oclVecB.close()
+        oclVecC.close()
+      }
+
+      //Test multiplication in OpenMP
+      {
+
+        ms = System.currentTimeMillis()
+        val ompMxA = toVclDenseRM(mxA, mainCtx)
+        val ompVecB = toVclVec(dvecB, mainCtx)
 
         val ompVecC = new VCLVector(prod(ompMxA, ompVecB))
         val ompDvecC = fromVClVec(ompVecC)
@@ -356,7 +371,6 @@ class ViennaCLSuiteVCL extends FunSuite with Matchers {
       oclCtx.deallocate()
       oclCtx.close()
 
-
   }