diff --git a/.travis.yml b/.travis.yml index ab8e29d813e2023312d37e05d343101f2cd029d1..9e39083a0044adf446c6b7ad910074363486391b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -216,9 +216,9 @@ matrix: - ENV_CMAKE_OPTIONS="-DOpenCL_LIBRARY=${OPENCL_ROOT}/lib/libOpenCL.so -DOpenCL_INCLUDE_DIR=${OPENCL_ROOT}/include" before_install: - #install maven 3.5.0 - - export M2_HOME=$HOME/apache-maven-3.5.0 - - if [ ! -d $M2_HOME/bin ]; then curl https://archive.apache.org/dist/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-bin.tar.gz | tar zxf - -C $HOME; fi + #install maven 3.5.4 + - export M2_HOME=$HOME/apache-maven-3.5.4 + - if [ ! -d $M2_HOME/bin ]; then curl https://archive.apache.org/dist/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz | tar zxf - -C $HOME; fi - export PATH=$M2_HOME/bin:$PATH # Install dependencies diff --git a/pom.xml b/pom.xml index 7ba0cd6f10e7d7f1e06bcde10ea3106c83b7ebd4..f07238aea4f6ff8aa8a1c09942ebe88d6585fb95 100644 --- a/pom.xml +++ b/pom.xml @@ -98,6 +98,11 @@ <artifactId>bcel</artifactId> <version>6.2</version> </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-library</artifactId> + <version>2.12.6</version> + </dependency> </dependencies> <build> @@ -107,6 +112,22 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> </plugin> + <plugin> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>3.4.1</version> + <executions> + <execution> + <goals> + <goal>compile</goal> + <goal>testCompile</goal> + </goals> + </execution> + </executions> + <configuration> + <scalaVersion>2.12.6</scalaVersion> + </configuration> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> diff --git a/src/main/java/com/aparapi/internal/instruction/ExpressionList.java b/src/main/java/com/aparapi/internal/instruction/ExpressionList.java index 4aa24b5028a0ba2b1bb4eac0f8b09f0b2526c1c0..c7d38b13445944ce97d6095f85c216711483c731 100644 --- a/src/main/java/com/aparapi/internal/instruction/ExpressionList.java +++ b/src/main/java/com/aparapi/internal/instruction/ExpressionList.java @@ -813,7 +813,8 @@ public class ExpressionList{ logger.fine("Scope block from " + startPc + " to " + (tail.getThisPC() + tail.getLength())); for (Instruction i = head; i != null; i = i.getNextPC()) { if (i.getThisPC() == startPc) { - final Instruction startInstruction = i.getRootExpr().getPrevExpr(); + final Instruction j = i.getRootExpr().getPrevExpr(); + final Instruction startInstruction = j == null ? i : j; logger.fine("Start = " + startInstruction); addAsComposites(ByteCode.COMPOSITE_ARBITRARY_SCOPE, startInstruction.getPrevExpr(), null); diff --git a/src/main/java/com/aparapi/internal/instruction/InstructionSet.java b/src/main/java/com/aparapi/internal/instruction/InstructionSet.java index cc331733f2696dffdd509c804ccd1d31cc63ee92..9fe5a71a74e1bb327066b78bd0d737cb55d48563 100644 --- a/src/main/java/com/aparapi/internal/instruction/InstructionSet.java +++ b/src/main/java/com/aparapi/internal/instruction/InstructionSet.java @@ -1276,7 +1276,7 @@ public class InstructionSet{ @Override public boolean isDeclaration() { LocalVariableInfo lvi = method.getLocalVariableTableEntry().getVariable(getThisPC() + getLength(), getLocalVariableTableIndex()); - return (lvi != null) && (lvi.getStart() == getThisPC() + getLength()); + return (lvi != null) && (lvi.getStart() == getThisPC() + getLength() || lvi.getStart() == getThisPC()); } @Override public String getDescription() { diff --git a/src/test/scala/com/aparapi/SimpleScalaTest.scala b/src/test/scala/com/aparapi/SimpleScalaTest.scala new file mode 100644 index 0000000000000000000000000000000000000000..945598aca92b077192276f0a1d38765162299ae4 --- /dev/null +++ b/src/test/scala/com/aparapi/SimpleScalaTest.scala @@ -0,0 +1,86 @@ +package com.aparapi + +import com.aparapi.codegen.Diff +import com.aparapi.internal.model.ClassModel +import com.aparapi.internal.writer.KernelWriter +import org.junit.Test + +import scala.util.Random + +class SimpleScalaTest { + def runKernel(inA: Array[Float], inB: Array[Float]): Array[Float] = { + val result = new Array[Float](inA.length) + val kernel = new Kernel() { + override def run() { + val i = getGlobalId() + result(i) = ((inA(i) + inB(i)) / (inA(i) / inB(i))) * ((inA(i) - inB(i)) / (inA( + i) * inB(i))) - + ((inB(i) - inA(i)) * (inB(i) + inA(i))) * ((inB(i) - inA(i)) / (inB(i) * inA( + i))) + } + } + + kernel.execute(inA.length) + result + } + + def generateCL(inA: Array[Float], inB: Array[Float]): String = { + val result = new Array[Float](inA.length) + val kernel = new Kernel() { + override def run() { + val i = getGlobalId() + result(i) = ((inA(i) + inB(i)) / (inA(i) / inB(i))) * ((inA(i) - inB(i)) / (inA( + i) * inB(i))) - + ((inB(i) - inA(i)) * (inB(i) + inA(i))) * ((inB(i) - inA(i)) / (inB(i) * inA( + i))) + } + } + + val classModel = ClassModel.createClassModel(kernel.getClass) + + val entryPoint = classModel.getEntrypoint("run", kernel) + KernelWriter.writeToString(entryPoint) + } + + @Test def testKernel(): Unit = { + val a = Array.fill(50000)(Random.nextFloat()) + val b = Array.fill(50000)(Random.nextFloat()) + assert(runKernel(a, b).length == 50000) + } + + @Test def testCL(): Unit = { + val a = Array.fill(50000)(Random.nextFloat()) + val b = Array.fill(50000)(Random.nextFloat()) + val expected = + """typedef struct This_s{ + | __global float *result$2; + | __global float *inA$2; + | __global float *inB$2; + | int passid; + |}This; + |int get_pass_id(This *this){ + | return this->passid; + |} + |__kernel void run( + | __global float *result$2, + | __global float *inA$2, + | __global float *inB$2, + | int passid + |){ + | This thisStruct; + | This* this=&thisStruct; + | this->result$2 = result$2; + | this->inA$2 = inA$2; + | this->inB$2 = inB$2; + | this->passid = passid; + | { + | { + | int i = get_global_id(0); + | this->result$2[i] = (((this->inA$2[i] + this->inB$2[i]) / (this->inA$2[i] / this->inB$2[i])) * ((this->inA$2[i] - this->inB$2[i]) / (this->inA$2[i] * this->inB$2[i]))) - (((this->inB$2[i] - this->inA$2[i]) * (this->inB$2[i] + this->inA$2[i])) * ((this->inB$2[i] - this->inA$2[i]) / (this->inB$2[i] * this->inA$2[i]))); + | } + | return; + | } + |}""".stripMargin + assert(Diff.same(expected, generateCL(a, b))) + } +}