viennacl and viennacl-omp Pall-scala
Project: http://git-wip-us.apache.org/repos/asf/mahout/repo Commit: http://git-wip-us.apache.org/repos/asf/mahout/commit/9a4f9d36 Tree: http://git-wip-us.apache.org/repos/asf/mahout/tree/9a4f9d36 Diff: http://git-wip-us.apache.org/repos/asf/mahout/diff/9a4f9d36 Branch: refs/heads/master Commit: 9a4f9d36298259274dac94665eda7ce9e482cdbd Parents: 72dfcee Author: rawkintrevo <trevor.d.gr...@gmail.com> Authored: Thu Jul 27 11:45:39 2017 -0500 Committer: rawkintrevo <trevor.d.gr...@gmail.com> Committed: Thu Jul 27 11:45:39 2017 -0500 ---------------------------------------------------------------------- .../src/main/assembly/scala-2.10_spark-1.6.xml | 2 +- .../src/main/assembly/scala-2.11_spark-2.0.xml | 2 +- .../src/main/assembly/scala-2.11_spark-2.1.xml | 4 +- viennacl-omp/linux-haswell.properties | 28 -- viennacl-omp/linux-x86_64-viennacl.properties | 24 - viennacl-omp/pom.xml | 243 +--------- .../scala-2.10/linux-haswell.properties | 28 ++ .../scala-2.10/linux-x86_64-viennacl.properties | 24 + viennacl-omp/scala-2.10/pom.xml | 324 +++++++++++-- viennacl-omp/scala-2.10/runs | 32 ++ .../viennacl/openmp/javacpp/Functions.java | 103 +++++ .../openmp/javacpp/LinalgFunctions.java | 86 ++++ .../openmp/javacpp/MatrixTransExpression.scala | 34 ++ .../apache/mahout/viennacl/openmp/OMPMMul.scala | 449 +++++++++++++++++++ .../openmp/javacpp/CompressedMatrix.scala | 135 ++++++ .../viennacl/openmp/javacpp/Context.scala | 58 +++ .../openmp/javacpp/DenseColumnMatrix.scala | 95 ++++ .../openmp/javacpp/DenseRowMatrix.scala | 81 ++++ .../openmp/javacpp/MatMatProdExpression.scala | 33 ++ .../openmp/javacpp/MatVecProdExpression.scala | 33 ++ .../viennacl/openmp/javacpp/MatrixBase.scala | 75 ++++ .../viennacl/openmp/javacpp/MemHandle.scala | 34 ++ .../openmp/javacpp/ProdExpression.scala | 33 ++ .../javacpp/SrMatDnMatProdExpression.scala | 33 ++ .../viennacl/openmp/javacpp/VCLVector.scala | 124 +++++ .../openmp/javacpp/VecMultExpression.scala | 32 ++ .../viennacl/openmp/javacpp/VectorBase.scala | 55 +++ .../apache/mahout/viennacl/openmp/package.scala | 434 ++++++++++++++++++ .../mahout/viennacl/omp/ViennaCLSuiteOMP.scala | 249 ++++++++++ .../scala-2.11/linux-haswell.properties | 28 ++ .../scala-2.11/linux-x86_64-viennacl.properties | 24 + viennacl-omp/scala-2.11/pom.xml | 325 ++++++++++++-- viennacl-omp/scala-2.11/runs | 32 ++ .../viennacl/openmp/javacpp/Functions.java | 103 +++++ .../openmp/javacpp/LinalgFunctions.java | 86 ++++ .../openmp/javacpp/MatrixTransExpression.scala | 34 ++ .../apache/mahout/viennacl/openmp/OMPMMul.scala | 449 +++++++++++++++++++ .../openmp/javacpp/CompressedMatrix.scala | 135 ++++++ .../viennacl/openmp/javacpp/Context.scala | 58 +++ .../openmp/javacpp/DenseColumnMatrix.scala | 95 ++++ .../openmp/javacpp/DenseRowMatrix.scala | 81 ++++ .../openmp/javacpp/MatMatProdExpression.scala | 33 ++ .../openmp/javacpp/MatVecProdExpression.scala | 33 ++ .../viennacl/openmp/javacpp/MatrixBase.scala | 75 ++++ .../viennacl/openmp/javacpp/MemHandle.scala | 34 ++ .../openmp/javacpp/ProdExpression.scala | 33 ++ .../javacpp/SrMatDnMatProdExpression.scala | 33 ++ .../viennacl/openmp/javacpp/VCLVector.scala | 124 +++++ .../openmp/javacpp/VecMultExpression.scala | 32 ++ .../viennacl/openmp/javacpp/VectorBase.scala | 55 +++ .../apache/mahout/viennacl/openmp/package.scala | 434 ++++++++++++++++++ .../mahout/viennacl/omp/ViennaCLSuiteOMP.scala | 249 ++++++++++ .../viennacl/openmp/javacpp/Functions.java | 103 ----- .../openmp/javacpp/LinalgFunctions.java | 86 ---- .../openmp/javacpp/MatrixTransExpression.scala | 34 -- .../apache/mahout/viennacl/openmp/OMPMMul.scala | 449 ------------------- .../openmp/javacpp/CompressedMatrix.scala | 135 ------ .../viennacl/openmp/javacpp/Context.scala | 58 --- .../openmp/javacpp/DenseColumnMatrix.scala | 95 ---- .../openmp/javacpp/DenseRowMatrix.scala | 81 ---- .../openmp/javacpp/MatMatProdExpression.scala | 33 -- .../openmp/javacpp/MatVecProdExpression.scala | 33 -- .../viennacl/openmp/javacpp/MatrixBase.scala | 75 ---- .../viennacl/openmp/javacpp/MemHandle.scala | 34 -- .../openmp/javacpp/ProdExpression.scala | 33 -- .../javacpp/SrMatDnMatProdExpression.scala | 33 -- .../viennacl/openmp/javacpp/VCLVector.scala | 124 ----- .../openmp/javacpp/VecMultExpression.scala | 32 -- .../viennacl/openmp/javacpp/VectorBase.scala | 55 --- .../apache/mahout/viennacl/openmp/package.scala | 434 ------------------ .../mahout/viennacl/omp/ViennaCLSuiteOMP.scala | 249 ---------- viennacl/linux-haswell.properties | 28 -- viennacl/linux-x86_64-viennacl.properties | 24 - viennacl/pom.xml | 230 +--------- viennacl/scala-2.10/linux-haswell.properties | 28 ++ .../scala-2.10/linux-x86_64-viennacl.properties | 24 + viennacl/scala-2.10/pom.xml | 314 +++++++++++-- .../viennacl/opencl/javacpp/Functions.java | 104 +++++ .../opencl/javacpp/LinalgFunctions.java | 86 ++++ .../opencl/javacpp/MatrixTransExpression.scala | 34 ++ .../apache/mahout/viennacl/opencl/GPUMMul.scala | 444 ++++++++++++++++++ .../opencl/javacpp/CompressedMatrix.scala | 135 ++++++ .../viennacl/opencl/javacpp/Context.scala | 73 +++ .../opencl/javacpp/DenseColumnMatrix.scala | 95 ++++ .../opencl/javacpp/DenseRowMatrix.scala | 98 ++++ .../opencl/javacpp/MatMatProdExpression.scala | 33 ++ .../opencl/javacpp/MatVecProdExpression.scala | 33 ++ .../viennacl/opencl/javacpp/MatrixBase.scala | 75 ++++ .../viennacl/opencl/javacpp/MemHandle.scala | 48 ++ .../opencl/javacpp/ProdExpression.scala | 33 ++ .../javacpp/SrMatDnMatProdExpression.scala | 33 ++ .../viennacl/opencl/javacpp/VCLVector.scala | 144 ++++++ .../opencl/javacpp/VecMultExpression.scala | 32 ++ .../viennacl/opencl/javacpp/VectorBase.scala | 58 +++ .../apache/mahout/viennacl/opencl/package.scala | 434 ++++++++++++++++++ .../viennacl/opencl/ViennaCLSuiteVCL.scala | 441 ++++++++++++++++++ viennacl/scala-2.11/linux-haswell.properties | 28 ++ .../scala-2.11/linux-x86_64-viennacl.properties | 24 + viennacl/scala-2.11/pom.xml | 316 +++++++++++-- .../viennacl/opencl/javacpp/Functions.java | 104 +++++ .../opencl/javacpp/LinalgFunctions.java | 86 ++++ .../opencl/javacpp/MatrixTransExpression.scala | 34 ++ .../apache/mahout/viennacl/opencl/GPUMMul.scala | 444 ++++++++++++++++++ .../opencl/javacpp/CompressedMatrix.scala | 135 ++++++ .../viennacl/opencl/javacpp/Context.scala | 73 +++ .../opencl/javacpp/DenseColumnMatrix.scala | 95 ++++ .../opencl/javacpp/DenseRowMatrix.scala | 98 ++++ .../opencl/javacpp/MatMatProdExpression.scala | 33 ++ .../opencl/javacpp/MatVecProdExpression.scala | 33 ++ .../viennacl/opencl/javacpp/MatrixBase.scala | 75 ++++ .../viennacl/opencl/javacpp/MemHandle.scala | 48 ++ .../opencl/javacpp/ProdExpression.scala | 33 ++ .../javacpp/SrMatDnMatProdExpression.scala | 33 ++ .../viennacl/opencl/javacpp/VCLVector.scala | 144 ++++++ .../opencl/javacpp/VecMultExpression.scala | 32 ++ .../viennacl/opencl/javacpp/VectorBase.scala | 58 +++ .../apache/mahout/viennacl/opencl/package.scala | 434 ++++++++++++++++++ .../viennacl/opencl/ViennaCLSuiteVCL.scala | 441 ++++++++++++++++++ .../viennacl/opencl/javacpp/Functions.java | 104 ----- .../opencl/javacpp/LinalgFunctions.java | 86 ---- .../opencl/javacpp/MatrixTransExpression.scala | 34 -- .../apache/mahout/viennacl/opencl/GPUMMul.scala | 444 ------------------ .../opencl/javacpp/CompressedMatrix.scala | 135 ------ .../viennacl/opencl/javacpp/Context.scala | 73 --- .../opencl/javacpp/DenseColumnMatrix.scala | 95 ---- .../opencl/javacpp/DenseRowMatrix.scala | 98 ---- .../opencl/javacpp/MatMatProdExpression.scala | 33 -- .../opencl/javacpp/MatVecProdExpression.scala | 33 -- .../viennacl/opencl/javacpp/MatrixBase.scala | 75 ---- .../viennacl/opencl/javacpp/MemHandle.scala | 48 -- .../opencl/javacpp/ProdExpression.scala | 33 -- .../javacpp/SrMatDnMatProdExpression.scala | 33 -- .../viennacl/opencl/javacpp/VCLVector.scala | 144 ------ .../opencl/javacpp/VecMultExpression.scala | 32 -- .../viennacl/opencl/javacpp/VectorBase.scala | 58 --- .../apache/mahout/viennacl/opencl/package.scala | 434 ------------------ .../viennacl/opencl/ViennaCLSuiteVCL.scala | 441 ------------------ 137 files changed, 10662 insertions(+), 5301 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/distribution/src/main/assembly/scala-2.10_spark-1.6.xml ---------------------------------------------------------------------- diff --git a/distribution/src/main/assembly/scala-2.10_spark-1.6.xml b/distribution/src/main/assembly/scala-2.10_spark-1.6.xml index 5ae0834..02fb0cf 100644 --- a/distribution/src/main/assembly/scala-2.10_spark-1.6.xml +++ b/distribution/src/main/assembly/scala-2.10_spark-1.6.xml @@ -116,7 +116,7 @@ <outputDirectory/> </fileSet> <fileSet> - <directory>${project.basedir}/../math-scala/target</directory> + <directory>${project.basedir}/../math-scala/scala-2.10/target</directory> <includes> <include>mahout-*2.10*.jar</include> </includes> http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/distribution/src/main/assembly/scala-2.11_spark-2.0.xml ---------------------------------------------------------------------- diff --git a/distribution/src/main/assembly/scala-2.11_spark-2.0.xml b/distribution/src/main/assembly/scala-2.11_spark-2.0.xml index cab595b..2a7cc68 100644 --- a/distribution/src/main/assembly/scala-2.11_spark-2.0.xml +++ b/distribution/src/main/assembly/scala-2.11_spark-2.0.xml @@ -116,7 +116,7 @@ <outputDirectory/> </fileSet> <fileSet> - <directory>${project.basedir}/../math-scala/target</directory> + <directory>${project.basedir}/../math-scala/scala-2.11/target</directory> <includes> <include>mahout-*2.11*.jar</include> </includes> http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/distribution/src/main/assembly/scala-2.11_spark-2.1.xml ---------------------------------------------------------------------- diff --git a/distribution/src/main/assembly/scala-2.11_spark-2.1.xml b/distribution/src/main/assembly/scala-2.11_spark-2.1.xml index 40a3566..a791763 100644 --- a/distribution/src/main/assembly/scala-2.11_spark-2.1.xml +++ b/distribution/src/main/assembly/scala-2.11_spark-2.1.xml @@ -116,7 +116,7 @@ <outputDirectory/> </fileSet> <fileSet> - <directory>${project.basedir}/../math-scala/target</directory> + <directory>${project.basedir}/../math-scala/scala-2.11/target</directory> <includes> <include>mahout-*2.11*.jar</include> </includes> @@ -128,7 +128,7 @@ <outputDirectory/> </fileSet> <fileSet> - <directory>${project.basedir}/../spark/target</directory> + <directory>${project.basedir}/../spark/spark-2.1/target</directory> <includes> <include>mahout-*2.1-2.11*spark.jar</include> <include>mahout-*2.1-2.11*dependency-reduced.jar</include> http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/linux-haswell.properties ---------------------------------------------------------------------- diff --git a/viennacl-omp/linux-haswell.properties b/viennacl-omp/linux-haswell.properties deleted file mode 100644 index 3ee4494..0000000 --- a/viennacl-omp/linux-haswell.properties +++ /dev/null @@ -1,28 +0,0 @@ -platform=linux-x86_64 -platform.path.separator=: -platform.source.suffix=.cpp -platform.includepath.prefix=-I -platform.includepath= -platform.compiler=g++ -platform.compiler.cpp11=-std=c++11 -platform.compiler.default= -platform.compiler.fastfpu=-msse3 -ffast-math -platform.compiler.viennacl=-fopenmp -fpermissive -platform.compiler.nodeprecated=-Wno-deprecated-declarations -#build for haswell arch with for GCC >= 4.9.0 -platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=haswell -m64 -Wall -O3 -fPIC -shared -s -o\u0020 -#for GCC < 4.9.0 use -march=core-avx2 for haswell arch -#platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=core-avx2 -m64 -Wall -Ofast -fPIC -shared -s -o\u0020 -#build for native: -#platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=native -m64 -Wall -Ofast -fPIC -shared -s -o\u0020 -platform.linkpath.prefix=-L -platform.linkpath.prefix2=-Wl,-rpath, -platform.linkpath= -platform.link.prefix=-l -platform.link.suffix= -platform.link= -platform.framework.prefix=-F -platform.framework.suffix= -platform.framework= -platform.library.prefix=lib -platform.library.suffix=.so http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/linux-x86_64-viennacl.properties ---------------------------------------------------------------------- diff --git a/viennacl-omp/linux-x86_64-viennacl.properties b/viennacl-omp/linux-x86_64-viennacl.properties deleted file mode 100644 index e5de1fa..0000000 --- a/viennacl-omp/linux-x86_64-viennacl.properties +++ /dev/null @@ -1,24 +0,0 @@ -platform=linux-x86_64 -platform.path.separator=: -platform.source.suffix=.cpp -platform.includepath.prefix=-I -platform.includepath= -platform.compiler=g++ -platform.compiler.cpp11=-std=c++11 -platform.compiler.default= -platform.compiler.fastfpu=-msse3 -ffast-math -platform.compiler.viennacl=-fopenmp -fpermissive -platform.compiler.nodeprecated=-Wno-deprecated-declarations -# platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=x86-64 -m64 -Wall -O3 -fPIC -shared -s -o\u0020 -platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=native -m64 -Wall -Ofast -fPIC -shared -s -o\u0020 -platform.linkpath.prefix=-L -platform.linkpath.prefix2=-Wl,-rpath, -platform.linkpath= -platform.link.prefix=-l -platform.link.suffix= -platform.link= -platform.framework.prefix=-F -platform.framework.suffix= -platform.framework= -platform.library.prefix=lib -platform.library.suffix=.so http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/pom.xml ---------------------------------------------------------------------- diff --git a/viennacl-omp/pom.xml b/viennacl-omp/pom.xml index 756dab6..5829094 100644 --- a/viennacl-omp/pom.xml +++ b/viennacl-omp/pom.xml @@ -35,229 +35,6 @@ <packaging>pom</packaging> - <build> - <plugins> - <!-- create test jar so other modules can reuse the native test utility classes. --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <executions> - <execution> - <goals> - <goal>test-jar</goal> - </goals> - <phase>package</phase> - </execution> - </executions> - </plugin> - - <plugin> - <artifactId>maven-javadoc-plugin</artifactId> - </plugin> - - <plugin> - <artifactId>maven-source-plugin</artifactId> - </plugin> - - <plugin> - <groupId>net.alchim31.maven</groupId> - <artifactId>scala-maven-plugin</artifactId> - <executions> - <execution> - <id>add-scala-sources</id> - <phase>initialize</phase> - <goals> - <goal>add-source</goal> - </goals> - </execution> - <execution> - <id>scala-compile</id> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - <execution> - <id>scala-test-compile</id> - <phase>process-test-resources</phase> - <goals> - <goal>testCompile</goal> - </goals> - </execution> - </executions> - </plugin> - - <!--this is what scalatest recommends to do to enable scala tests --> - - <!-- disable surefire --> - <!-- disable surefire --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <skipTests>true</skipTests> - </configuration> - </plugin> - <!-- enable scalatest --> - <plugin> - <groupId>org.scalatest</groupId> - <artifactId>scalatest-maven-plugin</artifactId> - <executions> - <execution> - <id>test</id> - <goals> - <goal>test</goal> - </goals> - </execution> - </executions> - <configuration> - <argLine>-Xmx4g</argLine> - </configuration> - </plugin> - - - <!--JavaCPP native build plugin--> - <!-- old-style way to get it to compile. --> - <!--based on https://github.com/bytedeco/javacpp/wiki/Maven--> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>1.2.1</version> - <executions> - <execution> - <id>javacpp</id> - <phase>process-classes</phase> - <goals> - <goal>exec</goal> - </goals> - <configuration> - <environmentVariables> - <LD_LIBRARY_PATH>{project.basedir}/target/classes/org/apache/mahout/javacpp/linalg/linux-x86_64/ - </LD_LIBRARY_PATH> - </environmentVariables> - <executable>java</executable> - <arguments> - <argument>-jar</argument> - <argument>${org.bytedeco:javacpp:jar}</argument> - <argument>-propertyfile</argument> - <argument>linux-x86_64-viennacl.properties</argument> - <argument>-classpath</argument> - <argument>${project.build.outputDirectory}:${org.scala-lang:scala-library:jar}</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.CompressedMatrix</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.Context</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.MatrixBase</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.DenseRowMatrix</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.DenseColumnMatrix</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.MatMatProdExpression</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.ProdExpression</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.MatrixTransExpression</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.LinalgFunctions</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.Functions</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.VectorBase</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.VCLVector</argument> - <argument>org.apache.mahout.viennacl.openmp.javacpp.VecMultExpression</argument> - <argument>org.apache.mahout.viennacl.openmp.OMPMMul</argument> - <argument>org.apache.mahout.viennacl.openmp.OMPMMul$</argument> - </arguments> - </configuration> - </execution> - </executions> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-dependency-plugin</artifactId> - <version>2.3</version> - <executions> - <execution> - <goals> - <goal>properties</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <version>1.2.1</version> - </plugin> - - <!-- copy jars to top directory, which is MAHOUT_HOME --> - <plugin> - <artifactId>maven-antrun-plugin</artifactId> - <version>1.4</version> - <executions> - <execution> - <id>copy</id> - <!--<phase>package</phase>--> - <configuration> - <tasks> - <copy file="target/mahout-native-viennacl-omp_${scala.compat.version}-${version}.jar" tofile="../mahout-native-viennacl-omp_${scala.compat.version}-${version}.jar" /> - </tasks> - </configuration> - <goals> - <goal>run</goal> - </goals> - </execution> - </executions> - </plugin> - <!-- delete jars on claen in top directory, which is MAHOUT_HOME --> - <plugin> - <artifactId>maven-clean-plugin</artifactId> - <version>3.0.0</version> - <configuration> - <filesets> - <fileset> - <directory>../</directory> - <includes> - <include>mahout-native-viennacl-omp*.jar</include> - </includes> - <followSymlinks>false</followSymlinks> - </fileset> - </filesets> - </configuration> - </plugin> - </plugins> - - - - </build> - - <dependencies> - - <dependency> - <groupId>${project.groupId}</groupId> - <artifactId>mahout-math-scala_${scala.compat.version}</artifactId> - </dependency> - - <!-- 3rd-party --> - <dependency> - <groupId>log4j</groupId> - <artifactId>log4j</artifactId> - </dependency> - - <!-- scala stuff --> - <dependency> - <groupId>org.scalatest</groupId> - <artifactId>scalatest_${scala.compat.version}</artifactId> - </dependency> - - <!-- scala-library for annotations at compile time--> - <!--<dependency>--> - <!--<groupId>org.scala-lang</groupId>--> - <!--<artifactId>scala-library</artifactId>--> - <!--<version>${scala.version}</version>--> - <!--</dependency>--> - - - <dependency> - <groupId>org.bytedeco</groupId> - <artifactId>javacpp</artifactId> - <version>1.2.4</version> - </dependency> - - </dependencies> - <profiles> <profile> @@ -310,5 +87,25 @@ </plugins> </build> </profile> + <profile> + <id>all-scala</id> + <modules> + <module>scala-2.10</module> + <module>scala-2.11</module> + </modules> + </profile> + <profile> + <id>scala-2.10</id> + <modules> + <module>scala-2.10</module> + </modules> + </profile> + <profile> + <id>scala-2.11</id> + <modules> + <module>scala-2.11</module> + </modules> + </profile> + </profiles> </project> http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/linux-haswell.properties ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/linux-haswell.properties b/viennacl-omp/scala-2.10/linux-haswell.properties new file mode 100644 index 0000000..3ee4494 --- /dev/null +++ b/viennacl-omp/scala-2.10/linux-haswell.properties @@ -0,0 +1,28 @@ +platform=linux-x86_64 +platform.path.separator=: +platform.source.suffix=.cpp +platform.includepath.prefix=-I +platform.includepath= +platform.compiler=g++ +platform.compiler.cpp11=-std=c++11 +platform.compiler.default= +platform.compiler.fastfpu=-msse3 -ffast-math +platform.compiler.viennacl=-fopenmp -fpermissive +platform.compiler.nodeprecated=-Wno-deprecated-declarations +#build for haswell arch with for GCC >= 4.9.0 +platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=haswell -m64 -Wall -O3 -fPIC -shared -s -o\u0020 +#for GCC < 4.9.0 use -march=core-avx2 for haswell arch +#platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=core-avx2 -m64 -Wall -Ofast -fPIC -shared -s -o\u0020 +#build for native: +#platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=native -m64 -Wall -Ofast -fPIC -shared -s -o\u0020 +platform.linkpath.prefix=-L +platform.linkpath.prefix2=-Wl,-rpath, +platform.linkpath= +platform.link.prefix=-l +platform.link.suffix= +platform.link= +platform.framework.prefix=-F +platform.framework.suffix= +platform.framework= +platform.library.prefix=lib +platform.library.suffix=.so http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/linux-x86_64-viennacl.properties ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/linux-x86_64-viennacl.properties b/viennacl-omp/scala-2.10/linux-x86_64-viennacl.properties new file mode 100644 index 0000000..e5de1fa --- /dev/null +++ b/viennacl-omp/scala-2.10/linux-x86_64-viennacl.properties @@ -0,0 +1,24 @@ +platform=linux-x86_64 +platform.path.separator=: +platform.source.suffix=.cpp +platform.includepath.prefix=-I +platform.includepath= +platform.compiler=g++ +platform.compiler.cpp11=-std=c++11 +platform.compiler.default= +platform.compiler.fastfpu=-msse3 -ffast-math +platform.compiler.viennacl=-fopenmp -fpermissive +platform.compiler.nodeprecated=-Wno-deprecated-declarations +# platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=x86-64 -m64 -Wall -O3 -fPIC -shared -s -o\u0020 +platform.compiler.output=-Wl,-rpath,$ORIGIN/ -Wl,-z,noexecstack -Wl,-Bsymbolic -march=native -m64 -Wall -Ofast -fPIC -shared -s -o\u0020 +platform.linkpath.prefix=-L +platform.linkpath.prefix2=-Wl,-rpath, +platform.linkpath= +platform.link.prefix=-l +platform.link.suffix= +platform.link= +platform.framework.prefix=-F +platform.framework.suffix= +platform.framework= +platform.library.prefix=lib +platform.library.suffix=.so http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/pom.xml ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/pom.xml b/viennacl-omp/scala-2.10/pom.xml index f78cfc1..d4610f1 100644 --- a/viennacl-omp/scala-2.10/pom.xml +++ b/viennacl-omp/scala-2.10/pom.xml @@ -18,16 +18,20 @@ --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.mahout</groupId> - <artifactId>mahout-native-viennacl-omp</artifactId> - <version>0.13.2-SNAPSHOT</version> - <relativePath>../pom.xml</relativePath> - </parent> + <modelVersion>4.0.0</modelVersion> - <artifactId>mahout-native-viennacl-omp_2.10</artifactId> - <name>Mahout Native VienniaCL OpenCL OpenMP Bindings for Scala 2.10</name> + <parent> + <groupId>org.apache.mahout</groupId> + <artifactId>mahout</artifactId> + <version>0.13.2-SNAPSHOT</version> + <relativePath>../pom.xml</relativePath> + </parent> + + <artifactId>mahout-native-viennacl-omp_2.10</artifactId> + + <name>Mahout Native VienniaCL OpenMP Bindings</name> + <description>Native Structures and interfaces to be used from Mahout math-scala. + </description> <properties> @@ -35,34 +39,282 @@ <scala.version>2.10.4</scala.version> </properties> - <packaging>jar</packaging> + <packaging>jar</packaging> - <build> - <sourceDirectory>../src/main</sourceDirectory> + <build> + <plugins> + <!-- create test jar so other modules can reuse the native test utility classes. --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>test-jar</goal> + </goals> + <phase>package</phase> + </execution> + </executions> + </plugin> - <plugins> - <plugin> - <artifactId>maven-antrun-plugin</artifactId> - <executions> - <execution> - <id>copy</id> - <phase>package</phase> - </execution> - </executions> - </plugin> - <plugin> - <!-- disable javacpp recompile, its wasteful and causes issues --> - <groupId>org.codehaus.mojo</groupId> - <artifactId>exec-maven-plugin</artifactId> - <executions> - <execution> - <id>javacpp</id> - <phase/> - </execution> - </executions> - </plugin> + <plugin> + <artifactId>maven-javadoc-plugin</artifactId> + </plugin> - </plugins> - </build> + <plugin> + <artifactId>maven-source-plugin</artifactId> + </plugin> + + <plugin> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <executions> + <execution> + <id>add-scala-sources</id> + <phase>initialize</phase> + <goals> + <goal>add-source</goal> + </goals> + </execution> + <execution> + <id>scala-compile</id> + <phase>process-resources</phase> + <goals> + <goal>compile</goal> + </goals> + </execution> + <execution> + <id>scala-test-compile</id> + <phase>process-test-resources</phase> + <goals> + <goal>testCompile</goal> + </goals> + </execution> + </executions> + </plugin> + + <!--this is what scalatest recommends to do to enable scala tests --> + + <!-- disable surefire --> + <!-- disable surefire --> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>true</skipTests> + </configuration> + </plugin> + <!-- enable scalatest --> + <plugin> + <groupId>org.scalatest</groupId> + <artifactId>scalatest-maven-plugin</artifactId> + <executions> + <execution> + <id>test</id> + <goals> + <goal>test</goal> + </goals> + </execution> + </executions> + <configuration> + <argLine>-Xmx4g</argLine> + </configuration> + </plugin> + + + <!--JavaCPP native build plugin--> + <!-- old-style way to get it to compile. --> + <!--based on https://github.com/bytedeco/javacpp/wiki/Maven--> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.2.1</version> + <executions> + <execution> + <id>javacpp</id> + <phase>process-classes</phase> + <goals> + <goal>exec</goal> + </goals> + <configuration> + <environmentVariables> + <LD_LIBRARY_PATH>{project.basedir}/target/classes/org/apache/mahout/javacpp/linalg/linux-x86_64/ + </LD_LIBRARY_PATH> + </environmentVariables> + <executable>java</executable> + <arguments> + <argument>-jar</argument> + <argument>${org.bytedeco:javacpp:jar}</argument> + <argument>-propertyfile</argument> + <argument>linux-x86_64-viennacl.properties</argument> + <argument>-classpath</argument> + <argument>${project.build.outputDirectory}:${org.scala-lang:scala-library:jar}</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.CompressedMatrix</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.Context</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.MatrixBase</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.DenseRowMatrix</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.DenseColumnMatrix</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.MatMatProdExpression</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.ProdExpression</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.MatrixTransExpression</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.LinalgFunctions</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.Functions</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.VectorBase</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.VCLVector</argument> + <argument>org.apache.mahout.viennacl.openmp.javacpp.VecMultExpression</argument> + <argument>org.apache.mahout.viennacl.openmp.OMPMMul</argument> + <argument>org.apache.mahout.viennacl.openmp.OMPMMul$</argument> + </arguments> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <version>2.3</version> + <executions> + <execution> + <goals> + <goal>properties</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.2.1</version> + </plugin> + + <!-- copy jars to top directory, which is MAHOUT_HOME --> + <plugin> + <artifactId>maven-antrun-plugin</artifactId> + <version>1.4</version> + <executions> + <execution> + <id>copy</id> + <phase>package</phase> + <configuration> + <tasks> + <copy file="target/mahout-native-viennacl-omp_2.10-${project.version}.jar" tofile="../../mahout-native-viennacl-omp_2.10-${project.version}.jar" /> + </tasks> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + </executions> + </plugin> + <!-- delete jars on claen in top directory, which is MAHOUT_HOME --> + <plugin> + <artifactId>maven-clean-plugin</artifactId> + <version>3.0.0</version> + <configuration> + <filesets> + <fileset> + <directory>../../</directory> + <includes> + <include>mahout-native-viennacl-omp_2.10*.jar</include> + </includes> + <followSymlinks>false</followSymlinks> + </fileset> + </filesets> + </configuration> + </plugin> + </plugins> + + + + </build> -</project> \ No newline at end of file + <dependencies> + + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>mahout-math-scala_${scala.compat.version}</artifactId> + </dependency> + + <!-- 3rd-party --> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + </dependency> + + <!-- scala stuff --> + <dependency> + <groupId>org.scalatest</groupId> + <artifactId>scalatest_${scala.compat.version}</artifactId> + </dependency> + + <!-- scala-library for annotations at compile time--> + <!--<dependency>--> + <!--<groupId>org.scala-lang</groupId>--> + <!--<artifactId>scala-library</artifactId>--> + <!--<version>${scala.version}</version>--> + <!--</dependency>--> + + + <dependency> + <groupId>org.bytedeco</groupId> + <artifactId>javacpp</artifactId> + <version>1.2.4</version> + </dependency> + + </dependencies> + + + <profiles> + <profile> + <id>mahout-release</id> + <build> + <plugins> + <plugin> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <executions> + <execution> + <id>generate-scaladoc</id> + <goals> + <goal>doc</goal> + </goals> + </execution> + <execution> + <id>attach-scaladoc-jar</id> + <goals> + <goal>doc-jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + </profile> + <profile> + <id>travis</id> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <!-- Limit memory for unit tests in Travis --> + <argLine>-Xmx3g</argLine> + <!--<argLine>-Djava.library.path=${project.build.directory}/libs/natives/linux-x86_64:${project.build.directory}/libs/natives/linux:${project.build.directory}/libs/natives/maxosx</argLine>--> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + <configuration> + <!-- Limit memory for integration tests in Travis --> + <argLine>-Xmx3g</argLine> + <!--<argLine>-Djava.library.path=${project.build.directory}/libs/natives/linux-x86_64:${project.build.directory}/libs/natives/linux:${project.build.directory}/libs/natives/maxosx</argLine>--> + </configuration> + </plugin> + </plugins> + </build> + </profile> + </profiles> +</project> http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/runs ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/runs b/viennacl-omp/scala-2.10/runs new file mode 100644 index 0000000..a152244 --- /dev/null +++ b/viennacl-omp/scala-2.10/runs @@ -0,0 +1,32 @@ +original +row-major viennacl::matrix + + OCL matrix memory domain after assgn=2 +- dense vcl mmul with fast_copy +- mmul microbenchmark + + Mahout multiplication time: 15699 ms. + + ViennaCL/OpenCL multiplication time: 3625 ms. + + ompA mem domain:1 + + ompB mem domain:1 + + ViennaCL/cpu/OpenMP multiplication time: 2838 ms. + +with sys.ArrayCopy, all dense. +ViennaCLSuite: +- row-major viennacl::matrix + + OCL matrix memory domain after assgn=2 +- dense vcl mmul with fast_copy +- mmul microbenchmark + + Mahout multiplication time: 15407 ms. + + ViennaCL/OpenCL multiplication time: 3499 ms. + + ompA mem domain:1 + + ompB mem domain:1 + + ViennaCL/cpu/OpenMP multiplication time: 2714 ms. + +DL latest +ViennaCLSuite: +- row-major viennacl::matrix + + OCL matrix memory domain after assgn=2 +- dense vcl mmul with fast_copy +- mmul microbenchmark + + Mahout multiplication time: 16076 ms. + + ViennaCL/OpenCL multiplication time: 3360 ms. + + ViennaCL/cpu/OpenMP multiplication time: 2666 ms. http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/Functions.java ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/Functions.java b/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/Functions.java new file mode 100644 index 0000000..c2bffe5 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/Functions.java @@ -0,0 +1,103 @@ +/** + * 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.mahout.viennacl.openmp.javacpp; + +import org.bytedeco.javacpp.BytePointer; +import org.bytedeco.javacpp.DoublePointer; +import org.bytedeco.javacpp.IntPointer; +import org.bytedeco.javacpp.annotation.*; + +import java.nio.DoubleBuffer; +import java.nio.IntBuffer; + + +@Properties(inherit = Context.class, + value = @Platform( + library = "jniViennaCL" + ) +) +@Namespace("viennacl") +public final class Functions { + + private Functions() { + } + + // This is (imo) an inconsistency in Vienna cl: almost all operations require MatrixBase, and + // fast_copy require type `matrix`, i.e., one of DenseRowMatrix or DenseColumnMatrix. + @Name("fast_copy") + public static native void fastCopy(DoublePointer srcBegin, DoublePointer srcEnd, @ByRef DenseRowMatrix dst); + + @Name("fast_copy") + public static native void fastCopy(DoublePointer srcBegin, DoublePointer srcEnd, @ByRef DenseColumnMatrix dst); + + @Name("fast_copy") + public static native void fastCopy(@ByRef DenseRowMatrix src, DoublePointer dst); + + @Name("fast_copy") + public static native void fastCopy(@ByRef DenseColumnMatrix src, DoublePointer dst); + + @Name("fast_copy") + public static native void fastCopy(@Const @ByRef VectorBase dst, @Const @ByRef VCLVector src); + + @Name("fast_copy") + public static native void fastCopy(@Const @ByRef VCLVector src, @Const @ByRef VectorBase dst); + + + @ByVal + public static native MatrixTransExpression trans(@ByRef MatrixBase src); + + @Name("backend::memory_read") + public static native void memoryReadInt(@Const @ByRef MemHandle src_buffer, + int bytes_to_read, + int offset, + IntPointer ptr, + boolean async); + + @Name("backend::memory_read") + public static native void memoryReadDouble(@Const @ByRef MemHandle src_buffer, + int bytes_to_read, + int offset, + DoublePointer ptr, + boolean async); + + @Name("backend::memory_read") + public static native void memoryReadInt(@Const @ByRef MemHandle src_buffer, + int bytes_to_read, + int offset, + IntBuffer ptr, + boolean async); + + @Name("backend::memory_read") + public static native void memoryReadDouble(@Const @ByRef MemHandle src_buffer, + int bytes_to_read, + int offset, + DoubleBuffer ptr, + boolean async); + + @Name("backend::memory_read") + public static native void memoryReadBytes(@Const @ByRef MemHandle src_buffer, + int bytes_to_read, + int offset, + BytePointer ptr, + boolean async); + + + static { + Context.loadLib(); + } + +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/LinalgFunctions.java ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/LinalgFunctions.java b/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/LinalgFunctions.java new file mode 100644 index 0000000..c2a40d9 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/LinalgFunctions.java @@ -0,0 +1,86 @@ +/** + * 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.mahout.viennacl.openmp.javacpp; + +import org.apache.mahout.viennacl.openmp.javacpp.*; +import org.bytedeco.javacpp.annotation.*; + + +@Properties(inherit = Context.class, + value = @Platform( + library = "jniViennaCL" + ) +) +@Namespace("viennacl::linalg") +public final class LinalgFunctions { + + private LinalgFunctions() { + } + + static { + Context.loadLib(); + } + + + @ByVal + public static native MatMatProdExpression prod(@Const @ByRef MatrixBase a, + @Const @ByRef MatrixBase b); + + @ByVal + public static native ProdExpression prod(@Const @ByRef CompressedMatrix a, + @Const @ByRef CompressedMatrix b); + + @ByVal + public static native MatVecProdExpression prod(@Const @ByRef MatrixBase a, + @Const @ByRef VectorBase b); + + @ByVal + public static native SrMatDnMatProdExpression prod(@Const @ByRef CompressedMatrix spMx, + @Const @ByRef MatrixBase dMx); + @ByVal + @Name("prod") + public static native DenseColumnMatrix prodCm(@Const @ByRef MatrixBase a, + @Const @ByRef MatrixBase b); + @ByVal + @Name("prod") + public static native DenseRowMatrix prodRm(@Const @ByRef MatrixBase a, + @Const @ByRef MatrixBase b); + + @ByVal + @Name("prod") + public static native DenseRowMatrix prodRm(@Const @ByRef CompressedMatrix spMx, + @Const @ByRef MatrixBase dMx); + + +// @ByVal +// public static native MatrixProdExpression prod(@Const @ByRef DenseRowMatrix a, +// @Const @ByRef DenseRowMatrix b); +// +// @ByVal +// public static native MatrixProdExpression prod(@Const @ByRef DenseRowMatrix a, +// @Const @ByRef DenseColumnMatrix b); +// +// @ByVal +// public static native MatrixProdExpression prod(@Const @ByRef DenseColumnMatrix a, +// @Const @ByRef DenseRowMatrix b); +// +// @ByVal +// public static native MatrixProdExpression prod(@Const @ByRef DenseColumnMatrix a, +// @Const @ByRef DenseColumnMatrix b); + + +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/MatrixTransExpression.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/MatrixTransExpression.scala b/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/MatrixTransExpression.scala new file mode 100644 index 0000000..82574b4 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/java/org/apache/mahout/viennacl/openmp/javacpp/MatrixTransExpression.scala @@ -0,0 +1,34 @@ +/** + * 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.mahout.viennacl.openmp.javacpp; + +import org.bytedeco.javacpp.Pointer +import org.bytedeco.javacpp.annotation.{Name, Namespace, Platform, Properties} + + +@Properties(inherit = Array(classOf[Context]), + value = Array(new Platform( + include = Array("matrix.hpp"), + library = "jniViennaCL") + )) +@Namespace("viennacl") +@Name(Array("matrix_expression<const viennacl::matrix_base<double>, " + + "const viennacl::matrix_base<double>, " + + "viennacl::op_trans>")) +class MatrixTransExpression extends Pointer { + +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/OMPMMul.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/OMPMMul.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/OMPMMul.scala new file mode 100644 index 0000000..9a59999 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/OMPMMul.scala @@ -0,0 +1,449 @@ +/* + * 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.mahout.viennacl.openmp + +import org.apache.mahout.logging._ +import org.apache.mahout.math +import org.apache.mahout.math._ +import org.apache.mahout.math.backend.incore.MMulSolver +import org.apache.mahout.math.flavor.{BackEnum, TraversingStructureEnum} +import org.apache.mahout.math.function.Functions +import org.apache.mahout.math.scalabindings.RLikeOps._ +import org.apache.mahout.math.scalabindings._ +import org.apache.mahout.viennacl.openmp.javacpp.Functions._ +import org.apache.mahout.viennacl.openmp.javacpp.LinalgFunctions._ +import org.apache.mahout.viennacl.openmp.javacpp.{CompressedMatrix, Context, DenseRowMatrix} + +import scala.collection.JavaConversions._ + +object OMPMMul extends MMBinaryFunc { + + private implicit val log = getLog(OMPMMul.getClass) + + override def apply(a: Matrix, b: Matrix, r: Option[Matrix]): Matrix = { + + require(a.ncol == b.nrow, "Incompatible matrix sizes in matrix multiplication.") + + val (af, bf) = (a.getFlavor, b.getFlavor) + val backs = (af.getBacking, bf.getBacking) + val sd = (af.getStructure, math.scalabindings.densityAnalysis(a), bf.getStructure, densityAnalysis(b)) + + + try { + + val alg: MMulAlg = backs match { + + // Both operands are jvm memory backs. + case (BackEnum.JVMMEM, BackEnum.JVMMEM) â + + sd match { + + // Multiplication cases by a diagonal matrix. + case (TraversingStructureEnum.VECTORBACKED, _, TraversingStructureEnum.COLWISE, _) + if a.isInstanceOf[DiagonalMatrix] â jvmDiagCW + case (TraversingStructureEnum.VECTORBACKED, _, TraversingStructureEnum.SPARSECOLWISE, _) + if a.isInstanceOf[DiagonalMatrix] â jvmDiagCW + case (TraversingStructureEnum.VECTORBACKED, _, TraversingStructureEnum.ROWWISE, _) + if a.isInstanceOf[DiagonalMatrix] â jvmDiagRW + case (TraversingStructureEnum.VECTORBACKED, _, TraversingStructureEnum.SPARSEROWWISE, _) + if a.isInstanceOf[DiagonalMatrix] â jvmDiagRW + + case (TraversingStructureEnum.COLWISE, _, TraversingStructureEnum.VECTORBACKED, _) + if b.isInstanceOf[DiagonalMatrix] â jvmCWDiag + case (TraversingStructureEnum.SPARSECOLWISE, _, TraversingStructureEnum.VECTORBACKED, _) + if b.isInstanceOf[DiagonalMatrix] â jvmCWDiag + case (TraversingStructureEnum.ROWWISE, _, TraversingStructureEnum.VECTORBACKED, _) + if b.isInstanceOf[DiagonalMatrix] â jvmRWDiag + case (TraversingStructureEnum.SPARSEROWWISE, _, TraversingStructureEnum.VECTORBACKED, _) + if b.isInstanceOf[DiagonalMatrix] â jvmRWDiag + + // Dense-dense cases + case (TraversingStructureEnum.ROWWISE, true, TraversingStructureEnum.COLWISE, true) if a eq b.t â ompDRWAAt + case (TraversingStructureEnum.ROWWISE, true, TraversingStructureEnum.COLWISE, true) if a.t eq b â ompDRWAAt + case (TraversingStructureEnum.ROWWISE, true, TraversingStructureEnum.COLWISE, true) â ompRWCW + case (TraversingStructureEnum.ROWWISE, true, TraversingStructureEnum.ROWWISE, true) â jvmRWRW + case (TraversingStructureEnum.COLWISE, true, TraversingStructureEnum.COLWISE, true) â jvmCWCW + case (TraversingStructureEnum.COLWISE, true, TraversingStructureEnum.ROWWISE, true) if a eq b.t â jvmDCWAAt + case (TraversingStructureEnum.COLWISE, true, TraversingStructureEnum.ROWWISE, true) if a.t eq b â jvmDCWAAt + case (TraversingStructureEnum.COLWISE, true, TraversingStructureEnum.ROWWISE, true) â jvmCWRW + + // Sparse row matrix x sparse row matrix (array of vectors) + case (TraversingStructureEnum.ROWWISE, false, TraversingStructureEnum.ROWWISE, false) â ompSparseRWRW + case (TraversingStructureEnum.ROWWISE, false, TraversingStructureEnum.COLWISE, false) â jvmSparseRWCW + case (TraversingStructureEnum.COLWISE, false, TraversingStructureEnum.ROWWISE, false) â jvmSparseCWRW + case (TraversingStructureEnum.COLWISE, false, TraversingStructureEnum.COLWISE, false) â jvmSparseCWCW + + // Sparse matrix x sparse matrix (hashtable of vectors) + case (TraversingStructureEnum.SPARSEROWWISE, false, TraversingStructureEnum.SPARSEROWWISE, false) â + ompSparseRowRWRW + case (TraversingStructureEnum.SPARSEROWWISE, false, TraversingStructureEnum.SPARSECOLWISE, false) â + jvmSparseRowRWCW + case (TraversingStructureEnum.SPARSECOLWISE, false, TraversingStructureEnum.SPARSEROWWISE, false) â + jvmSparseRowCWRW + case (TraversingStructureEnum.SPARSECOLWISE, false, TraversingStructureEnum.SPARSECOLWISE, false) â + jvmSparseRowCWCW + + // Sparse matrix x non-like + case (TraversingStructureEnum.SPARSEROWWISE, false, TraversingStructureEnum.ROWWISE, _) â ompSparseRowRWRW + case (TraversingStructureEnum.SPARSEROWWISE, false, TraversingStructureEnum.COLWISE, _) â jvmSparseRowRWCW + case (TraversingStructureEnum.SPARSECOLWISE, false, TraversingStructureEnum.ROWWISE, _) â jvmSparseRowCWRW + case (TraversingStructureEnum.SPARSECOLWISE, false, TraversingStructureEnum.COLWISE, _) â jvmSparseCWCW + case (TraversingStructureEnum.ROWWISE, _, TraversingStructureEnum.SPARSEROWWISE, false) â ompSparseRWRW + case (TraversingStructureEnum.ROWWISE, _, TraversingStructureEnum.SPARSECOLWISE, false) â jvmSparseRWCW + case (TraversingStructureEnum.COLWISE, _, TraversingStructureEnum.SPARSEROWWISE, false) â jvmSparseCWRW + case (TraversingStructureEnum.COLWISE, _, TraversingStructureEnum.SPARSECOLWISE, false) â jvmSparseRowCWCW + + // Everything else including at least one sparse LHS or RHS argument + case (TraversingStructureEnum.ROWWISE, false, TraversingStructureEnum.ROWWISE, _) â ompSparseRWRW + case (TraversingStructureEnum.ROWWISE, false, TraversingStructureEnum.COLWISE, _) â jvmSparseRWCW + case (TraversingStructureEnum.COLWISE, false, TraversingStructureEnum.ROWWISE, _) â jvmSparseCWRW + case (TraversingStructureEnum.COLWISE, false, TraversingStructureEnum.COLWISE, _) â jvmSparseCWCW2flips + + // Sparse methods are only effective if the first argument is sparse, so we need to do a swap. + case (_, _, _, false) â (a, b, r) â apply(b.t, a.t, r.map { + _.t + }).t + + // Default jvm-jvm case. + // for some reason a SrarseRowMatrix DRM %*% SrarseRowMatrix DRM was dumping off to here + case _ â ompRWCW + } + } + + alg(a, b, r) + } catch { + // TODO FASTHACK: just revert to JVM if there is an exception.. + // eg. java.lang.nullPointerException if more openCL contexts + // have been created than number of GPU cards. + // better option wuold be to fall back to OpenCl First. + case ex: Exception => + println(ex.getMessage + "falling back to JVM MMUL") + return MMul(a, b, r) + } + } + + type MMulAlg = MMBinaryFunc + + @inline + private def ompRWCW(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + println("ompRWCW") + // + // require(r.forall(mxR â mxR.nrow == a.nrow && mxR.ncol == b.ncol)) + // val (m, n) = (a.nrow, b.ncol) + // + // val mxR = r.getOrElse(if (densityAnalysis(a)) a.like(m, n) else b.like(m, n)) + // + // for (row â 0 until mxR.nrow; col â 0 until mxR.ncol) { + // // this vector-vector should be sort of optimized, right? + // mxR(row, col) = a(row, ::) dot b(::, col) + // } + // mxR + + val hasElementsA = a.zSum() > 0.0 + val hasElementsB = b.zSum() > 0.0 + + // A has a sparse matrix structure of unknown size. We do not want to + // simply convert it to a Dense Matrix which may result in an OOM error. + + // If it is empty use JVM MMul, since we can not convert it to a VCL CSR Matrix. + if (!hasElementsA) { + println("Matrix a has zero elements can not convert to CSR") + return MMul(a, b, r) + } + + // CSR matrices are efficient up to 50% non-zero + if (b.getFlavor.isDense) { + var ms = System.currentTimeMillis() + val oclCtx = new Context(Context.MAIN_MEMORY) + val oclA = toVclCmpMatrixAlt(a, oclCtx) + val oclB = toVclDenseRM(b, oclCtx) + val oclC = new DenseRowMatrix(prod(oclA, oclB)) + val mxC = fromVclDenseRM(oclC) + ms = System.currentTimeMillis() - ms + debug(s"ViennaCL/OpenMP multiplication time: $ms ms.") + + oclA.close() + oclB.close() + oclC.close() + + mxC + } else { + // Fall back to JVM based MMul if either matrix is sparse and empty + if (!hasElementsA || !hasElementsB) { + println("Matrix a or b has zero elements can not convert to CSR") + return MMul(a, b, r) + } + + var ms = System.currentTimeMillis() + val hostClCtx = new Context(Context.MAIN_MEMORY) + val oclA = toVclCmpMatrixAlt(a, hostClCtx) + val oclB = toVclCmpMatrixAlt(b, hostClCtx) + val oclC = new CompressedMatrix(prod(oclA, oclB)) + val mxC = fromVclCompressedMatrix(oclC) + ms = System.currentTimeMillis() - ms + debug(s"ViennaCL/OpenMP multiplication time: $ms ms.") + + oclA.close() + oclB.close() + oclC.close() + + mxC + } + } + + + @inline + private def jvmRWRW(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using jvmRWRW method") + // A bit hackish: currently, this relies a bit on the fact that like produces RW(?) + val bclone = b.like(b.ncol, b.nrow).t + for (brow â b) bclone(brow.index(), ::) := brow + + require(bclone.getFlavor.getStructure == TraversingStructureEnum.COLWISE || bclone.getFlavor.getStructure == + TraversingStructureEnum.SPARSECOLWISE, "COL wise conversion assumption of RHS is wrong, do over this code.") + + ompRWCW(a, bclone, r) + } + + private def jvmCWCW(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using jvmCWCW method") + jvmRWRW(b.t, a.t, r.map(_.t)).t + } + + private def jvmCWRW(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using jvmCWRW method") + // This is a primary contender with Outer Prod sum algo. + // Here, we force-reorient both matrices and run RWCW. + // A bit hackish: currently, this relies a bit on the fact that clone always produces RW(?) + val aclone = a.cloned + + require(aclone.getFlavor.getStructure == TraversingStructureEnum.ROWWISE || aclone.getFlavor.getStructure == + TraversingStructureEnum.SPARSEROWWISE, "Row wise conversion assumption of RHS is wrong, do over this code.") + + jvmRWRW(aclone, b, r) + } + + // left is Sparse right is any + private def ompSparseRWRW(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using ompSparseRWRW method") + val mxR = r.getOrElse(b.like(a.nrow, b.ncol)) + + /* Make sure that the matrix is not empty. VCL {{compressed_matrix}}s must + have nnz > 0 + N.B. This method is horribly inefficent. However there is a difference between + getNumNonDefaultElements() and getNumNonZeroElements() which we do not always + have access to. We created MAHOUT-1882 for this. + */ + + val hasElementsA = a.zSum() > 0.0 + val hasElementsB = b.zSum() > 0.0 + + // A has a sparse matrix structure of unknown size. We do not want to + // simply convert it to a Dense Matrix which may result in an OOM error. + // If it is empty use JVM MMul, since we can not convert it to a VCL CSR Matrix. + if (!hasElementsA) { + log.warn("Matrix a has zero elements can not convert to CSR") + return MMul(a, b, r) + } + + // CSR matrices are efficient up to 50% non-zero + if(b.getFlavor.isDense) { + var ms = System.currentTimeMillis() + val hostClCtx = new Context(Context.MAIN_MEMORY) + val oclA = toVclCmpMatrixAlt(a, hostClCtx) + val oclB = toVclDenseRM(b, hostClCtx) + val oclC = new DenseRowMatrix(prod(oclA, oclB)) + val mxC = fromVclDenseRM(oclC) + ms = System.currentTimeMillis() - ms + log.debug(s"ViennaCL/OpenMP multiplication time: $ms ms.") + + oclA.close() + oclB.close() + oclC.close() + + mxC + } else { + // Fall back to JVM based MMul if either matrix is sparse and empty + if (!hasElementsA || !hasElementsB) { + log.warn("Matrix a or b has zero elements can not convert to CSR") + return MMul(a, b, r) + } + + var ms = System.currentTimeMillis() + val hostClCtx = new Context(Context.MAIN_MEMORY) + val oclA = toVclCmpMatrixAlt(a, hostClCtx) + val oclB = toVclCmpMatrixAlt(b, hostClCtx) + val oclC = new CompressedMatrix(prod(oclA, oclB)) + val mxC = fromVclCompressedMatrix(oclC) + ms = System.currentTimeMillis() - ms + log.debug(s"ViennaCL/OpenMP multiplication time: $ms ms.") + + oclA.close() + oclB.close() + oclC.close() + + mxC + } + + } + + //sparse %*% dense + private def ompSparseRowRWRW(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using ompSparseRowRWRW method") + val hasElementsA = a.zSum() > 0 + + // A has a sparse matrix structure of unknown size. We do not want to + // simply convert it to a Dense Matrix which may result in an OOM error. + // If it is empty fall back to JVM MMul, since we can not convert it + // to a VCL CSR Matrix. + if (!hasElementsA) { + log.warn("Matrix a has zero elements can not convert to CSR") + return MMul(a, b, r) + } + + var ms = System.currentTimeMillis() + val hostClCtx = new Context(Context.MAIN_MEMORY) + val oclA = toVclCmpMatrixAlt(a, hostClCtx) + val oclB = toVclDenseRM(b, hostClCtx) + val oclC = new DenseRowMatrix(prod(oclA, oclB)) + val mxC = fromVclDenseRM(oclC) + ms = System.currentTimeMillis() - ms + log.debug(s"ViennaCL/OpenMP multiplication time: $ms ms.") + + oclA.close() + oclB.close() + oclC.close() + + mxC + } + + private def jvmSparseRowCWCW(a: Matrix, b: Matrix, r: Option[Matrix] = None) = + ompSparseRowRWRW(b.t, a.t, r.map(_.t)).t + + private def jvmSparseRowCWCW2flips(a: Matrix, b: Matrix, r: Option[Matrix] = None) = + ompSparseRowRWRW(a cloned, b cloned, r) + + private def jvmSparseRowRWCW(a: Matrix, b: Matrix, r: Option[Matrix]) = + ompSparseRowRWRW(a, b cloned, r) + + private def jvmSparseRowCWRW(a: Matrix, b: Matrix, r: Option[Matrix]) = + ompSparseRowRWRW(a cloned, b, r) + + private def jvmSparseRWCW(a: Matrix, b: Matrix, r: Option[Matrix] = None) = + ompSparseRWRW(a, b.cloned, r) + + private def jvmSparseCWRW(a: Matrix, b: Matrix, r: Option[Matrix] = None) = + ompSparseRWRW(a cloned, b, r) + + private def jvmSparseCWCW(a: Matrix, b: Matrix, r: Option[Matrix] = None) = + ompSparseRWRW(b.t, a.t, r.map(_.t)).t + + private def jvmSparseCWCW2flips(a: Matrix, b: Matrix, r: Option[Matrix] = None) = + ompSparseRWRW(a cloned, b cloned, r) + + private def jvmDiagRW(diagm:Matrix, b:Matrix, r:Option[Matrix] = None):Matrix = { + log.info("Using jvmDiagRW method") + val mxR = r.getOrElse(b.like(diagm.nrow, b.ncol)) + + for (del â diagm.diagv.nonZeroes()) + mxR(del.index, ::).assign(b(del.index, ::), Functions.plusMult(del)) + + mxR + } + + private def jvmDiagCW(diagm: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using jvmDiagCW method") + val mxR = r.getOrElse(b.like(diagm.nrow, b.ncol)) + for (bcol â b.t) mxR(::, bcol.index()) := bcol * diagm.diagv + mxR + } + + private def jvmCWDiag(a: Matrix, diagm: Matrix, r: Option[Matrix] = None) = + jvmDiagRW(diagm, a.t, r.map {_.t}).t + + private def jvmRWDiag(a: Matrix, diagm: Matrix, r: Option[Matrix] = None) = + jvmDiagCW(diagm, a.t, r.map {_.t}).t + + /** Dense column-wise AA' */ + private def jvmDCWAAt(a:Matrix, b:Matrix, r:Option[Matrix] = None) = { + // a.t must be equiv. to b. Cloning must rewrite to row-wise. + ompDRWAAt(a.cloned,null,r) + } + + /** Dense Row-wise AA' */ + // We probably will not want to use this for the actual release unless A is cached already + // but adding for testing purposes. + private def ompDRWAAt(a:Matrix, b:Matrix, r:Option[Matrix] = None) = { + // a.t must be equiv to b. + log.info("Executing on OMP") + log.debug("AAt computation detected; passing off to OMP") + + // Check dimensions if result is supplied. + require(r.forall(mxR â mxR.nrow == a.nrow && mxR.ncol == a.nrow)) + + val mxR = r.getOrElse(a.like(a.nrow, a.nrow)) + + var ms = System.currentTimeMillis() + val hostClCtx = new Context(Context.MAIN_MEMORY) + val oclA = toVclDenseRM(src = a, hostClCtx) + val oclAt = new DenseRowMatrix(trans(oclA)) + val oclC = new DenseRowMatrix(prod(oclA, oclAt)) + + val mxC = fromVclDenseRM(oclC) + ms = System.currentTimeMillis() - ms + log.debug(s"ViennaCL/OpenMP multiplication time: $ms ms.") + + oclA.close() + //oclApr.close() + oclAt.close() + oclC.close() + + mxC + + } + + private def jvmOuterProdSum(a: Matrix, b: Matrix, r: Option[Matrix] = None): Matrix = { + log.info("Using jvmOuterProdSum method") + // Need to check whether this is already laid out for outer product computation, which may be faster than + // reorienting both matrices. + val (m, n) = (a.nrow, b.ncol) + + // Prefer col-wise result iff a is dense and b is sparse. In all other cases default to row-wise. + val preferColWiseR = a.getFlavor.isDense && !b.getFlavor.isDense + + val mxR = r.getOrElse { + (a.getFlavor.isDense, preferColWiseR) match { + case (false, false) â b.like(m, n) + case (false, true) â b.like(n, m).t + case (true, false) â a.like(m, n) + case (true, true) â a.like(n, m).t + } + } + + // Loop outer products + if (preferColWiseR) { + // this means B is sparse and A is not, so we need to iterate over b values and update R columns with += + // one at a time. + for ((acol, brow) â a.t.zip(b); bel â brow.nonZeroes) mxR(::, bel.index()) += bel * acol + } else { + for ((acol, brow) â a.t.zip(b); ael â acol.nonZeroes()) mxR(ael.index(), ::) += ael * brow + } + + mxR + } +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/CompressedMatrix.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/CompressedMatrix.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/CompressedMatrix.scala new file mode 100644 index 0000000..3c5a6eb --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/CompressedMatrix.scala @@ -0,0 +1,135 @@ +/** + * 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.mahout.viennacl.openmp.javacpp + +import java.nio._ + +import org.bytedeco.javacpp._ +import org.bytedeco.javacpp.annotation._ + +import scala.collection.mutable.ArrayBuffer + + +@Properties(inherit = Array(classOf[Context]), + value = Array(new Platform( + include = Array("compressed_matrix.hpp"), + library="jniViennaCL" + ))) +@Name(Array("viennacl::compressed_matrix<double>")) +final class CompressedMatrix(defaultCtr: Boolean = true) extends Pointer { + + protected val ptrs = new ArrayBuffer[Pointer]() + + // call this after set or better TODO: yet wrap set() in a public method that will call this + def registerPointersForDeallocation(p:Pointer): Unit = { + ptrs += p + } + + override def deallocate(deallocate: Boolean): Unit = { + super.deallocate(deallocate) + ptrs.foreach(_.close()) + } + + if (defaultCtr) allocate() + + def this(nrow: Int, ncol: Int) { + this(false) + allocate(nrow, ncol, new Context) + } + + def this(nrow: Int, ncol: Int, ctx: Context) { + this(false) + allocate(nrow, ncol, ctx) + } + + def this(nrow: Int, ncol: Int, nonzeros: Int) { + this(false) + allocate(nrow, ncol, nonzeros, new Context) + } + + def this(nrow: Int, ncol: Int, nonzeros: Int, ctx: Context) { + this(false) + allocate(nrow, ncol, nonzeros, ctx) + } + + def this(pe: ProdExpression) { + this(false) + allocate(pe) + } + + @native protected def allocate() + + @native protected def allocate(nrow: Int, ncol: Int, nonzeros: Int, @ByVal ctx: Context) + + @native protected def allocate(nrow: Int, ncol: Int, @ByVal ctx: Context) + + @native protected def allocate(@Const @ByRef pe: ProdExpression) + +// @native protected def allocate(db: DoubleBuffer) +// +// @native protected def allocate(ib: IntBuffer) + + // Warning: apparently there are differences in bit interpretation between OpenCL and everything + // else for unsigned int type. So, for OpenCL backend, rowJumper and colIndices have to be packed + // with reference to that cl_uint type that Vienna-CL defines. + @native def set(@Cast(Array("const void*")) rowJumper: IntBuffer, + @Cast(Array("const void*")) colIndices: IntBuffer, + @Const elements: DoubleBuffer, + nrow: Int, + ncol: Int, + nonzeros: Int + ) + + /** With javacpp pointers. */ + @native def set(@Cast(Array("const void*")) rowJumper: IntPointer, + @Cast(Array("const void*")) colIndices: IntPointer, + @Const elements: DoublePointer, + nrow: Int, + ncol: Int, + nonzeros: Int + ) + + @Name(Array("operator=")) + @native def :=(@Const @ByRef pe: ProdExpression) + + @native def generate_row_block_information() + + /** getters for the compressed_matrix size */ + //const vcl_size_t & size1() const { return rows_; } + @native def size1: Int + //const vcl_size_t & size2() const { return cols_; } + @native def size2: Int + //const vcl_size_t & nnz() const { return nonzeros_; } + @native def nnz: Int + //const vcl_size_t & blocks1() const { return row_block_num_; } + // @native def blocks1: Int + + /** getters for the compressed_matrix buffers */ + //const handle_type & handle1() const { return row_buffer_; } + @native @Const @ByRef def handle1: MemHandle + //const handle_type & handle2() const { return col_buffer_; } + @native @Const @ByRef def handle2: MemHandle + //const handle_type & handle3() const { return row_blocks_; } + @native @Const @ByRef def handle3: MemHandle + //const handle_type & handle() const { return elements_; } + @native @Const @ByRef def handle: MemHandle + +} + +object CompressedMatrix { + Context.loadLib() +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/Context.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/Context.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/Context.scala new file mode 100644 index 0000000..ae1b782 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/Context.scala @@ -0,0 +1,58 @@ +package org.apache.mahout.viennacl.openmp.javacpp + + +import org.bytedeco.javacpp.annotation._ +import org.bytedeco.javacpp.{Loader, Pointer} + +/** + * This assumes viennacl 1.7.1 is installed, which in ubuntu Xenial defaults to + * /usr/include/viennacl, and is installed via + * {{{ + * sudo apt-get install libviennacl-dev + * }}} + * + * @param mtype + */ +@Properties(Array( + new Platform( + includepath = Array("/usr/include/viennacl"), + include = Array("matrix.hpp", "compressed_matrix.hpp"), + define = Array("VIENNACL_WITH_OPENMP"), + compiler = Array("fastfpu","viennacl"), + link = Array("OpenCL"), + library = "jniViennaCL" + ))) +@Namespace("viennacl") +@Name(Array("context")) +final class Context(mtype: Int = Context.MEMORY_NOT_INITIALIZED) extends Pointer { + + import Context._ + + if (mtype == MEMORY_NOT_INITIALIZED) + allocate() + else + allocate(mtype) + + @native protected def allocate() + + @native protected def allocate(@Cast(Array("viennacl::memory_types")) mtype: Int) + + @Name(Array("memory_type")) + @Cast(Array("int")) + @native def memoryType: Int + +} + +object Context { + + def loadLib() = Loader.load(classOf[Context]) + + loadLib() + + /* Memory types. Ported from VCL header files. */ + val MEMORY_NOT_INITIALIZED = 0 + val MAIN_MEMORY = 1 + val OPENCL_MEMORY = 2 + val CUDA_MEMORY = 3 + +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseColumnMatrix.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseColumnMatrix.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseColumnMatrix.scala new file mode 100644 index 0000000..71bdab2 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseColumnMatrix.scala @@ -0,0 +1,95 @@ +/** + * 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.mahout.viennacl.openmp.javacpp + +import org.bytedeco.javacpp.DoublePointer +import org.bytedeco.javacpp.annotation._ + +/** + * ViennaCL dense matrix, column-major. This is an exact duplication of [[DenseRowMatrix]], and + * is only different in the materialized C++ template name. Unfortunately I so far have not figured + * out how to handle it with. + * + * Also, the [[Platform.library]] does not get inherited for some reason, and we really want to + * collect all class mappings in the same one libjni.so, so we have to repeat this `library` defi- + * nition in every mapped class in this package. (One .so per package convention). + */ +@Properties(inherit = Array(classOf[Context]), + value = Array(new Platform ( + include=Array("matrix.hpp"), + library="jniViennaCL" + ))) +@Name(Array("viennacl::matrix<double,viennacl::column_major>")) +final class DenseColumnMatrix(initDefault:Boolean = true) extends MatrixBase { + + def this(nrow: Int, ncol: Int) { + this(false) + allocate(nrow, ncol, new Context()) + } + + def this(nrow: Int, ncol: Int, ctx: Context) { + this(false) + allocate(nrow, ncol, ctx) + } + + def this(data: DoublePointer, nrow: Int, ncol: Int) { + this(false) + allocate(data, new Context(Context.MAIN_MEMORY).memoryType, nrow, ncol) + // We save it to deallocate it ad deallocation time. + ptrs += data + } + + def this(data: DoublePointer, nrow: Int, ncol: Int, ctx: Context) { + this(false) + allocate(data, ctx.memoryType, nrow, ncol) + // We save it to deallocate it ad deallocation time. + ptrs += data + } + + def this(me: MatMatProdExpression) { + this(false) + allocate(me) + } + + def this(me: MatrixTransExpression) { + this(false) + allocate(me) + } + + + if (initDefault) allocate() + + @native protected def allocate() + + @native protected def allocate(nrow: Int, ncol: Int, @ByVal ctx: Context) + + @native protected def allocate(data: DoublePointer, + @Cast(Array("viennacl::memory_types")) + memType: Int, + nrow: Int, + ncol: Int + ) + + @native protected def allocate(@Const @ByRef me: MatMatProdExpression) + + @native protected def allocate(@Const @ByRef me: MatrixTransExpression) + +} + +object DenseColumnMatrix { + Context.loadLib() +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseRowMatrix.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseRowMatrix.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseRowMatrix.scala new file mode 100644 index 0000000..7bbd3a0 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/DenseRowMatrix.scala @@ -0,0 +1,81 @@ +package org.apache.mahout.viennacl.openmp.javacpp + +import org.bytedeco.javacpp.DoublePointer +import org.bytedeco.javacpp.annotation._ + +/** + * ViennaCL dense matrix, row-major. + */ +@Properties(inherit = Array(classOf[Context]), + value = Array(new Platform( + library = "jniViennaCL" + ))) +@Name(Array("viennacl::matrix<double,viennacl::row_major>")) +class DenseRowMatrix(initDefault: Boolean = true) extends MatrixBase { + + def this(nrow: Int, ncol: Int) { + this(false) + allocate(nrow, ncol, new Context()) + } + + def this(nrow: Int, ncol: Int, ctx: Context) { + this(false) + allocate(nrow, ncol, ctx) + } + + def this(data: DoublePointer, nrow: Int, ncol: Int) { + this(false) + allocate(data, new Context(Context.MAIN_MEMORY).memoryType, nrow, ncol) + // We save it to deallocate it ad deallocation time. + ptrs += data + } + + def this(data: DoublePointer, nrow: Int, ncol: Int, ctx: Context) { + this(false) + allocate(data, ctx.memoryType, nrow, ncol) + // We save it to deallocate it ad deallocation time. + ptrs += data + } + + def this(me: MatMatProdExpression) { + this(false) + allocate(me) + } + + def this(me: MatrixTransExpression) { + this(false) + allocate(me) + } + + // TODO: getting compilation errors here + def this(sd: SrMatDnMatProdExpression) { + this(false) + allocate(sd) + } + + if (initDefault) allocate() + + @native protected def allocate() + + @native protected def allocate(nrow: Int, ncol: Int, @ByVal ctx: Context) + + @native protected def allocate(data: DoublePointer, + @Cast(Array("viennacl::memory_types")) + memType: Int, + nrow: Int, + ncol: Int + ) + + @native protected def allocate(@Const @ByRef me: MatMatProdExpression) + + @native protected def allocate(@Const @ByRef me: MatrixTransExpression) + + // TODO: Compilation errors here + @native protected def allocate(@Const @ByRef me: SrMatDnMatProdExpression) + +} + + +object DenseRowMatrix { + Context.loadLib() +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatMatProdExpression.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatMatProdExpression.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatMatProdExpression.scala new file mode 100644 index 0000000..c15bbd9 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatMatProdExpression.scala @@ -0,0 +1,33 @@ +/** + * 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.mahout.viennacl.openmp.javacpp + +import org.bytedeco.javacpp.Pointer +import org.bytedeco.javacpp.annotation.{Name, Namespace, Platform, Properties} + + +@Properties(inherit = Array(classOf[Context]), + value = Array(new Platform( + library = "jniViennaCL") + )) +@Namespace("viennacl") +@Name(Array("matrix_expression<const viennacl::matrix_base<double>, " + + "const viennacl::matrix_base<double>, " + + "viennacl::op_mat_mat_prod>")) +class MatMatProdExpression extends Pointer { + +} http://git-wip-us.apache.org/repos/asf/mahout/blob/9a4f9d36/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatVecProdExpression.scala ---------------------------------------------------------------------- diff --git a/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatVecProdExpression.scala b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatVecProdExpression.scala new file mode 100644 index 0000000..4435232 --- /dev/null +++ b/viennacl-omp/scala-2.10/src/main/scala/org/apache/mahout/viennacl/openmp/javacpp/MatVecProdExpression.scala @@ -0,0 +1,33 @@ +/** + * 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.mahout.viennacl.openmp.javacpp + +import org.bytedeco.javacpp.Pointer +import org.bytedeco.javacpp.annotation.{Name, Namespace, Platform, Properties} + + +@Properties(inherit = Array(classOf[Context]), + value = Array(new Platform( + library = "jniViennaCL") + )) +@Namespace("viennacl") +@Name(Array("vector_expression<const viennacl::matrix_base<double>, " + + "const viennacl::vector_base<double>, " + + "viennacl::op_prod>")) +class MatVecProdExpression extends Pointer { + +}