diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java index 0454d75b12314b8a5aafd48c7b3ba5c87f471ef7..7674ffe3d593102ef53bd31583cba46cdf366bec 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/instruction/BranchSet.java @@ -97,7 +97,7 @@ import com.amd.aparapi.internal.instruction.InstructionSet.ConditionalBranch; * @author gfrost */ -public class BranchSet{ +public class BranchSet { /** * Base abstract class used to hold information used to construct node tree for logical expressions. * @@ -107,7 +107,7 @@ public class BranchSet{ * @author gfrost * */ - public static abstract class LogicalExpressionNode{ + public static abstract class LogicalExpressionNode { private LogicalExpressionNode next = null; private LogicalExpressionNode parent = null; @@ -122,6 +122,8 @@ public class BranchSet{ public abstract void invert(); + public abstract LogicalExpressionNode cloneInverted(); + public LogicalExpressionNode getRoot() { if (parent != null) { return (parent); @@ -154,24 +156,37 @@ public class BranchSet{ * @author gfrost * */ - public static class SimpleLogicalExpressionNode extends LogicalExpressionNode{ + public static class SimpleLogicalExpressionNode extends LogicalExpressionNode { private final ConditionalBranch branch; - protected boolean invert = false; + private boolean invert; public SimpleLogicalExpressionNode(ConditionalBranch _branch) { + this(_branch, false); + } + + private SimpleLogicalExpressionNode(ConditionalBranch _branch, boolean _invert) { branch = _branch; + invert = _invert; } - @Override public int getTarget() { + @Override + public int getTarget() { return (getBranch().getTarget().getThisPC()); } - @Override public void invert() { + @Override + public void invert() { invert = !invert; } - @Override public int getFallThrough() { + @Override + public LogicalExpressionNode cloneInverted() { + return new SimpleLogicalExpressionNode(branch, !invert); + } + + @Override + public int getFallThrough() { return (getBranch().getNextPC().getThisPC()); } @@ -182,6 +197,11 @@ public class BranchSet{ public ConditionalBranch getBranch() { return branch; } + + @Override + public String toString() { + return invert ? ("!(" + getBranch() + ")") : getBranch().toString(); + } } /** @@ -195,41 +215,56 @@ public class BranchSet{ * @author gfrost * */ - public static class CompoundLogicalExpressionNode extends LogicalExpressionNode{ + public static class CompoundLogicalExpressionNode extends LogicalExpressionNode { private final LogicalExpressionNode lhs; private final LogicalExpressionNode rhs; private boolean and; - public CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs) { + private CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs, + boolean applyInverts) { lhs = _lhs; and = _and; rhs = _rhs; setNext(_rhs.getNext()); - if (and) { - lhs.invert(); - // rhs.invert(); + if (applyInverts) { + if (and) { + lhs.invert(); + // rhs.invert(); + } } rhs.setParent(this); lhs.setParent(this); } - @Override public int getTarget() { + public CompoundLogicalExpressionNode(boolean _and, LogicalExpressionNode _lhs, LogicalExpressionNode _rhs) { + this(_and, _lhs, _rhs, true); + } + + @Override + public int getTarget() { return (rhs.getTarget()); } - @Override public void invert() { + @Override + public void invert() { and = !and; lhs.invert(); rhs.invert(); } + @Override + public LogicalExpressionNode cloneInverted() { + return new CompoundLogicalExpressionNode(!and, lhs.cloneInverted(), rhs.cloneInverted(), false); + } + public boolean isAnd() { return (and); } - @Override public int getFallThrough() { + @Override + public int getFallThrough() { return (rhs.getFallThrough()); } @@ -242,6 +277,12 @@ public class BranchSet{ return rhs; } + + @Override + public String toString() { + return getLhs().toString() + " " + (isAnd() ? "&&" : "||") + " " + getRhs().toString(); + } + } private final List<ConditionalBranch> set = new ArrayList<ConditionalBranch>(); diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java index ad66f9b39f69d8cc77473941971d7efefcb321b5..761117fbe3123d4e879a2961a4f84ec890aab13c 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/kernel/KernelRunner.java @@ -959,12 +959,12 @@ public class KernelRunner extends KernelRunnerJNI{ assert args != null : "args should not be null"; final boolean needSync = updateKernelArrayRefs(); if (needSync && logger.isLoggable(Level.FINE)) { - logger.fine("Need to resync arrays on " + kernel.getClass().getName()); + logger.fine("Need to resync arrays on " + describeKernelClass()); } // native side will reallocate array buffers if necessary if (runKernelJNI(jniContextHandle, _range, needSync, _passes) != 0) { - logger.warning("### CL exec seems to have failed. Trying to revert to Java ###"); + logger.warning("### " + describeKernelClass() + " - CL exec seems to have failed. Trying to revert to Java ###"); kernel.setFallbackExecutionMode(); return execute(_entrypointName, _range, _passes); } @@ -999,14 +999,18 @@ public class KernelRunner extends KernelRunnerJNI{ synchronized private Kernel warnFallBackAndExecute(String _entrypointName, final Range _range, final int _passes, Exception _exception) { if (logger.isLoggable(Level.WARNING)) { - logger.warning("Reverting to the next execution mode for " + kernel.getClass() + ": " + _exception.getMessage()); + logger.warning("Reverting to the next execution mode for " + describeKernelClass() + ": " + _exception.getMessage()); _exception.printStackTrace(); } return fallBackAndExecute(_entrypointName, _range, _passes); } + private String describeKernelClass() { + return kernel.getClass().getName(); + } + synchronized private Kernel warnFallBackAndExecute(String _entrypointName, final Range _range, final int _passes, String _excuse) { - logger.warning("Reverting to the next execution mode for " + kernel.getClass() + ": " + _excuse); + logger.warning("Reverting to the next execution mode for " + describeKernelClass() + ": " + _excuse); return fallBackAndExecute(_entrypointName, _range, _passes); } @@ -1295,7 +1299,7 @@ public class KernelRunner extends KernelRunnerJNI{ } if (Config.enableExecutionModeReporting) { - System.out.println(kernel.getClass().getCanonicalName() + ":" + kernel.getExecutionMode()); + System.out.println(describeKernelClass() + ":" + kernel.getExecutionMode()); } executionTime = System.currentTimeMillis() - executeStartTime; diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java index 95c362a357f0b09911f7f433d426809073bd67ec..e4728c5e892f769305fcec0f8b29878a1aecbd41 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/ClassModel.java @@ -2715,9 +2715,7 @@ public class ClassModel{ * @return The Method or null if we fail to locate a given method. */ public ClassModelMethod getMethod(MethodEntry _methodEntry, boolean _isSpecial) { - NameAndTypeEntry nameAndTypeEntry = _methodEntry.getNameAndTypeEntry(); - String utf8Name = nameAndTypeEntry.getNameUTF8Entry().getUTF8(); - final String entryClassNameInDotForm = utf8Name.replace('/', '.'); + final String entryClassNameInDotForm = _methodEntry.getClassEntry().getNameUTF8Entry().getUTF8().replace('/', '.'); // Shortcut direct calls to supers to allow "foo() { super.foo() }" type stuff to work if (_isSpecial && (superClazz != null) && superClazz.isSuperClass(entryClassNameInDotForm)) { @@ -2728,7 +2726,9 @@ public class ClassModel{ return superClazz.getMethod(_methodEntry, false); } - ClassModelMethod methodOrNull = getMethodOrNull(utf8Name, nameAndTypeEntry.getDescriptorUTF8Entry().getUTF8()); + NameAndTypeEntry nameAndTypeEntry = _methodEntry.getNameAndTypeEntry(); + ClassModelMethod methodOrNull = getMethodOrNull(nameAndTypeEntry.getNameUTF8Entry().getUTF8(), nameAndTypeEntry + .getDescriptorUTF8Entry().getUTF8()); if (methodOrNull == null) return superClazz != null ? superClazz.getMethod(_methodEntry, false) : (null); return methodOrNull; @@ -2737,8 +2737,7 @@ public class ClassModel{ // private ValueCache<MethodKey, MethodModel, AparapiException> methodModelCache = ValueCache.on(this::computeMethodModel); private ValueCache<MethodKey, MethodModel, AparapiException> methodModelCache = ValueCache .on(new ThrowingValueComputer<MethodKey, MethodModel, AparapiException>(){ - @Override - public MethodModel compute(MethodKey key) throws AparapiException { + @Override public MethodModel compute(MethodKey key) throws AparapiException { return computeMethodModel(key); } }); @@ -2797,8 +2796,7 @@ public class ClassModel{ // private final ValueCache<EntrypointKey, Entrypoint, AparapiException> entrypointCache = ValueCache.on(this::computeBasicEntrypoint); private final ValueCache<EntrypointKey, Entrypoint, AparapiException> entrypointCache = ValueCache .on(new ThrowingValueComputer<EntrypointKey, Entrypoint, AparapiException>(){ - @Override - public Entrypoint compute(EntrypointKey key) throws AparapiException { + @Override public Entrypoint compute(EntrypointKey key) throws AparapiException { return computeBasicEntrypoint(key); } }); @@ -2834,4 +2832,8 @@ public class ClassModel{ public static void invalidateCaches() { classModelCache.invalidate(); } + + @Override public String toString() { + return "ClassModel of " + getClassWeAreModelling(); + } } diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java index c6d7fc9b753c9d6f04550393d6766f680ffc7f0f..a629c97e5f9106705de09572a5569304fbeb3a3b 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/model/MethodModel.java @@ -98,7 +98,6 @@ public class MethodModel{ return noCL; } - public boolean isPrivateMemoryGetter() { return methodIsPrivateMemoryGetter; } @@ -1727,4 +1726,8 @@ public class MethodModel{ public Instruction getExprHead() { return (expressionList.getHead()); } + + @Override public String toString() { + return "MethodModel of " + method; + } } diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java index 9e9efc6381e8e658b6091b512bde5b4ff6583ef1..090c14542a9faad28a257043c40edee46834ef37 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/BlockWriter.java @@ -40,11 +40,14 @@ package com.amd.aparapi.internal.writer; import com.amd.aparapi.*; import com.amd.aparapi.internal.exception.*; import com.amd.aparapi.internal.instruction.*; +import com.amd.aparapi.internal.instruction.BranchSet.LogicalExpressionNode; +import com.amd.aparapi.internal.instruction.InstructionSet.AccessInstanceField; import com.amd.aparapi.internal.instruction.BranchSet.*; import com.amd.aparapi.internal.instruction.InstructionSet.*; import com.amd.aparapi.internal.model.ClassModel.ConstantPool.*; import com.amd.aparapi.internal.model.ClassModel.*; import com.amd.aparapi.internal.model.*; +import com.amd.aparapi.internal.model.ClassModel.ConstantPool.NameAndTypeEntry; import java.util.*; @@ -59,6 +62,7 @@ import java.util.*; public abstract class BlockWriter{ public final static String arrayLengthMangleSuffix = "__javaArrayLength"; + public final static String arrayDimMangleSuffix = "__javaArrayDimension"; public abstract void write(String _string); @@ -315,10 +319,7 @@ public abstract class BlockWriter{ public Instruction writeConditional(BranchSet _branchSet, boolean _invert) throws CodeGenException { final LogicalExpressionNode logicalExpression = _branchSet.getLogicalExpression(); - if (!_invert) { - logicalExpression.invert(); - } - write(logicalExpression); + write(_invert ? logicalExpression : logicalExpression.cloneInverted()); return (_branchSet.getLast().getNextExpr()); } @@ -416,7 +417,8 @@ public abstract class BlockWriter{ final AccessArrayElement arrayLoadInstruction = (AccessArrayElement) _instruction; //object array, get address - if(arrayLoadInstruction instanceof I_AALOAD) { + boolean isMultiDimensional = arrayLoadInstruction instanceof I_AALOAD && isMultiDimensionalArray(arrayLoadInstruction); + if (isMultiDimensional) { write("(&"); } writeInstruction(arrayLoadInstruction.getArrayRef()); @@ -425,22 +427,25 @@ public abstract class BlockWriter{ //object array, find the size of each object in the array //for 2D arrays, this size is the size of a row. - if(arrayLoadInstruction instanceof I_AALOAD) { + if (isMultiDimensional) { int dim = 0; Instruction load = arrayLoadInstruction.getArrayRef(); - while(load instanceof I_AALOAD) { + while (load instanceof I_AALOAD) { load = load.getFirstChild(); dim++; } - String arrayName = ((AccessInstanceField)load).getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8(); - write(" * this->" + arrayName + arrayDimMangleSuffix+dim); + NameAndTypeEntry nameAndTypeEntry = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry(); + if (isMultiDimensionalArray(nameAndTypeEntry)) { + String arrayName = nameAndTypeEntry.getNameUTF8Entry().getUTF8(); + write(" * this->" + arrayName + arrayDimMangleSuffix + dim); + } } write("]"); //object array, close parentheses - if(arrayLoadInstruction instanceof I_AALOAD) { + if (isMultiDimensional) { write(")"); } } else if (_instruction instanceof AccessField) { @@ -467,13 +472,14 @@ public abstract class BlockWriter{ //we're looking at int dim = 0; Instruction load = _instruction.getFirstChild(); - while(load instanceof I_AALOAD) { - load = load.getFirstChild(); - dim++; - } - final AccessInstanceField child = (AccessInstanceField) load; - final String arrayName = child.getConstantPoolFieldEntry().getNameAndTypeEntry().getNameUTF8Entry().getUTF8(); - write("this->" + arrayName + arrayLengthMangleSuffix + dim); + while (load instanceof I_AALOAD) { + load = load.getFirstChild(); + dim++; + } + NameAndTypeEntry nameAndTypeEntry = ((AccessInstanceField) load).getConstantPoolFieldEntry().getNameAndTypeEntry(); + final String arrayName = nameAndTypeEntry.getNameUTF8Entry().getUTF8(); + String dimSuffix = isMultiDimensionalArray(nameAndTypeEntry) ? Integer.toString(dim) : ""; + write("this->" + arrayName + arrayLengthMangleSuffix + dimSuffix); } else if (_instruction instanceof AssignToField) { final AssignToField assignedField = (AssignToField) _instruction; @@ -723,10 +729,38 @@ public abstract class BlockWriter{ } + private boolean isMultiDimensionalArray(NameAndTypeEntry nameAndTypeEntry) { + return nameAndTypeEntry.getDescriptorUTF8Entry().getUTF8().startsWith("[["); + } + + private boolean isObjectArray(NameAndTypeEntry nameAndTypeEntry) { + return nameAndTypeEntry.getDescriptorUTF8Entry().getUTF8().startsWith("[L"); + } + + private boolean isMultiDimensionalArray(final AccessArrayElement arrayLoadInstruction) { + AccessInstanceField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction); + return isMultiDimensionalArray(accessInstanceField.getConstantPoolFieldEntry().getNameAndTypeEntry()); + } + + private boolean isObjectArray(final AccessArrayElement arrayLoadInstruction) { + AccessInstanceField accessInstanceField = getUltimateInstanceFieldAccess(arrayLoadInstruction); + return isObjectArray(accessInstanceField.getConstantPoolFieldEntry().getNameAndTypeEntry()); + } + + private AccessInstanceField getUltimateInstanceFieldAccess(final AccessArrayElement arrayLoadInstruction) { + Instruction load = arrayLoadInstruction.getArrayRef(); + while (load instanceof I_AALOAD) { + load = load.getFirstChild(); + } + + return (AccessInstanceField) load; + } + public void writeMethod(MethodCall _methodCall, MethodEntry _methodEntry) throws CodeGenException { - boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods().contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8()); + boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods() + .contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8()); if (noCL) { - return; + return; } if (_methodCall instanceof VirtualMethodCall) { @@ -760,8 +794,7 @@ public abstract class BlockWriter{ if (_methodModel.isGetter() && !_methodModel.isNoCL()) { FieldEntry accessorVariableFieldEntry = _methodModel.getAccessorVariableFieldEntry(); writeGetterBlock(accessorVariableFieldEntry); - } - else { + } else { writeBlock(_methodModel.getExprHead(), null); } } diff --git a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java index 613b091fdbf4b09fda0bcb2dcc6a0e69db902582..92ce2fe930cda4a348b1c8b26b42eb0fb5cb19a7 100644 --- a/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java +++ b/com.amd.aparapi/src/java/com/amd/aparapi/internal/writer/KernelWriter.java @@ -38,7 +38,6 @@ under those regulations, please refer to the U.S. Bureau of Industry and Securit package com.amd.aparapi.internal.writer; import com.amd.aparapi.*; -import com.amd.aparapi.Kernel; import com.amd.aparapi.internal.exception.*; import com.amd.aparapi.internal.instruction.*; import com.amd.aparapi.internal.instruction.InstructionSet.*; @@ -47,8 +46,6 @@ import com.amd.aparapi.internal.model.ClassModel.AttributePool.*; import com.amd.aparapi.internal.model.ClassModel.AttributePool.RuntimeAnnotationsEntry.*; import com.amd.aparapi.internal.model.ClassModel.*; import com.amd.aparapi.internal.model.ClassModel.ConstantPool.*; -import com.amd.aparapi.opencl.OpenCL.Constant; -import com.amd.aparapi.opencl.OpenCL.*; import java.util.*; @@ -198,15 +195,16 @@ public abstract class KernelWriter extends BlockWriter{ if (m != null && m.isGetter()) { getterField = m.getAccessorVariableFieldEntry(); } - if (getterField != null) { - String fieldName = getterField.getNameAndTypeEntry().getNameUTF8Entry().getUTF8(); - write("this->"); - write(fieldName); - return; + if (getterField != null && isThis(_methodCall.getArg(0))) { + String fieldName = getterField.getNameAndTypeEntry().getNameUTF8Entry().getUTF8(); + write("this->"); + write(fieldName); + return; } - boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods().contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8()); + boolean noCL = _methodEntry.getOwnerClassModel().getNoCLMethods() + .contains(_methodEntry.getNameAndTypeEntry().getNameUTF8Entry().getUTF8()); if (noCL) { - return; + return; } final String intrinsicMapping = Kernel.getMappedMethodName(_methodEntry); // System.out.println("getMappedMethodName for " + methodName + " returned " + mapping); @@ -260,6 +258,10 @@ public abstract class KernelWriter extends BlockWriter{ } } + private boolean isThis(Instruction instruction) { + return instruction instanceof I_ALOAD_0; + } + public void writePragma(String _name, boolean _enable) { write("#pragma OPENCL EXTENSION " + _name + " : " + (_enable ? "en" : "dis") + "able"); newLine(); @@ -273,9 +275,10 @@ public abstract class KernelWriter extends BlockWriter{ public final static String __private = "__private"; - public final static String LOCAL_ANNOTATION_NAME = "L" + Local.class.getName().replace('.', '/') + ";"; + public final static String LOCAL_ANNOTATION_NAME = "L" + com.amd.aparapi.Kernel.Local.class.getName().replace('.', '/') + ";"; - public final static String CONSTANT_ANNOTATION_NAME = "L" + Constant.class.getName().replace('.', '/') + ";"; + public final static String CONSTANT_ANNOTATION_NAME = "L" + com.amd.aparapi.Kernel.Constant.class.getName().replace('.', '/') + + ";"; @Override public void write(Entrypoint _entryPoint) throws CodeGenException { final List<String> thisStruct = new ArrayList<String>(); @@ -308,7 +311,7 @@ public abstract class KernelWriter extends BlockWriter{ } if (privateMemorySize != null) { - type = __private; + type = __private; } final RuntimeAnnotationsEntry visibleAnnotations = field.getAttributePool().getRuntimeVisibleAnnotationsEntry(); @@ -328,7 +331,7 @@ public abstract class KernelWriter extends BlockWriter{ //if we have a an array we want to mark the object as a pointer //if we have a multiple dimensional array we want to remember the number of dimensions while (signature.startsWith("[")) { - if(isPointer == false) { + if (isPointer == false) { argLine.append(argType + " "); thisStructLine.append(type + " "); } @@ -382,19 +385,15 @@ public abstract class KernelWriter extends BlockWriter{ // Add int field into "this" struct for supporting java arraylength op // named like foo__javaArrayLength - if (isPointer && _entryPoint.getArrayFieldArrayLengthUsed().contains(field.getName()) || - isPointer && numDimensions > 1) { - - for(int i = 0; i < numDimensions; i++) { + if (isPointer && _entryPoint.getArrayFieldArrayLengthUsed().contains(field.getName()) || isPointer && numDimensions > 1) { + + for (int i = 0; i < numDimensions; i++) { final StringBuilder lenStructLine = new StringBuilder(); final StringBuilder lenArgLine = new StringBuilder(); final StringBuilder lenAssignLine = new StringBuilder(); - final StringBuilder dimStructLine = new StringBuilder(); - final StringBuilder dimArgLine = new StringBuilder(); - final StringBuilder dimAssignLine = new StringBuilder(); - String lenName = field.getName() + BlockWriter.arrayLengthMangleSuffix + - Integer.toString(i); + String suffix = numDimensions == 1 ? "" : Integer.toString(i); + String lenName = field.getName() + BlockWriter.arrayLengthMangleSuffix + suffix; lenStructLine.append("int " + lenName); @@ -409,21 +408,25 @@ public abstract class KernelWriter extends BlockWriter{ argLines.add(lenArgLine.toString()); thisStruct.add(lenStructLine.toString()); - String dimName = field.getName() + BlockWriter.arrayDimMangleSuffix + - Integer.toString(i); + if (numDimensions > 1) { + final StringBuilder dimStructLine = new StringBuilder(); + final StringBuilder dimArgLine = new StringBuilder(); + final StringBuilder dimAssignLine = new StringBuilder(); + String dimName = field.getName() + BlockWriter.arrayDimMangleSuffix + suffix; - dimStructLine.append("int " + dimName); + dimStructLine.append("int " + dimName); - dimAssignLine.append("this->"); - dimAssignLine.append(dimName); - dimAssignLine.append(" = "); - dimAssignLine.append(dimName); + dimAssignLine.append("this->"); + dimAssignLine.append(dimName); + dimAssignLine.append(" = "); + dimAssignLine.append(dimName); - dimArgLine.append("int " + dimName); + dimArgLine.append("int " + dimName); - assigns.add(dimAssignLine.toString()); - argLines.add(dimArgLine.toString()); - thisStruct.add(dimStructLine.toString()); + assigns.add(dimAssignLine.toString()); + argLines.add(dimArgLine.toString()); + thisStruct.add(dimStructLine.toString()); + } } } } @@ -704,7 +707,7 @@ public abstract class KernelWriter extends BlockWriter{ throw codeGenException; }/* catch (final Throwable t) { throw new CodeGenException(t); - }*/ + }*/ return (openCLStringBuilder.toString()); } diff --git a/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java b/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java index 37c77c41460875b2852946ffea6103c3552690aa..ca35b3a91ba0aeb843e56f660e71143333ed8cd7 100644 --- a/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java +++ b/test/codegen/src/java/com/amd/aparapi/CodeGenJUnitBase.java @@ -37,14 +37,17 @@ under those regulations, please refer to the U.S. Bureau of Industry and Securit */ package com.amd.aparapi; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import java.util.Arrays; + import com.amd.aparapi.internal.exception.AparapiException; import com.amd.aparapi.internal.model.ClassModel; import com.amd.aparapi.internal.model.Entrypoint; import com.amd.aparapi.internal.writer.KernelWriter; -public class CodeGenJUnitBase{ +public class CodeGenJUnitBase { protected void test(Class<?> _class, Class<? extends AparapiException> _expectedExceptionType, String[] expectedOpenCL) { try { @@ -53,7 +56,7 @@ public class CodeGenJUnitBase{ // String expected = source.getOpenCLString(); - ClassModel classModel = new ClassModel(_class); + ClassModel classModel = ClassModel.createClassModel(_class); // construct an artficial instance of our class here // we assume the specified class will have a null constructor @@ -94,15 +97,19 @@ public class CodeGenJUnitBase{ .println("}\n------------------------------------------------------------------------------------------------------"); } - assertTrue(_class.getSimpleName(), same); + if (!same) { + assertEquals(_class.getSimpleName(), Arrays.toString(expectedOpenCL), actual); + } } else { assertTrue("Expected exception " + _expectedExceptionType + " Instead we got {\n" + actual + "\n}", false); } + } catch (AssertionError e) { + throw e; } catch (Throwable t) { if (_expectedExceptionType == null || !t.getClass().isAssignableFrom(_expectedExceptionType)) { t.printStackTrace(); - assertTrue("Unexpected exception " + t, false); + throw new AssertionError("Unexpected exception " + t, t); } } } diff --git a/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java b/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java index 40c008513b3017c1e7096fb7bdf94b460e8d553b..028da4a87e979b4ba612434e79de7d7ee3717e16 100644 --- a/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java +++ b/test/codegen/src/java/com/amd/aparapi/CreateJUnitTests.java @@ -45,7 +45,7 @@ import java.io.PrintStream; import java.util.ArrayList; import java.util.List; -public class CreateJUnitTests{ +public class CreateJUnitTests { public static void main(String[] args) throws ClassNotFoundException, FileNotFoundException, IOException { File rootDir = new File(System.getProperty("root", ".")); @@ -57,9 +57,10 @@ public class CreateJUnitTests{ System.out.println(testDir.getCanonicalPath()); List<String> classNames = new ArrayList<String>(); - for (File sourceFile : testDir.listFiles(new FilenameFilter(){ + for (File sourceFile : testDir.listFiles(new FilenameFilter() { - @Override public boolean accept(File dir, String name) { + @Override + public boolean accept(File dir, String name) { return (name.endsWith(".java")); } })) { @@ -86,33 +87,10 @@ public class CreateJUnitTests{ sb.append("\n */\n"); } sb.append("public class " + className + " extends com.amd.aparapi.CodeGenJUnitBase{\n"); - sb.append(" @Test public void " + className + "(){\n"); - if (source.getOpenCLSectionCount() > 0) { - - sb.append(" String[] expectedOpenCL = new String[]{\n"); - for (List<String> opencl : source.getOpenCL()) { - sb.append(" \"\"\n"); - for (String line : opencl) { - sb.append(" +\"" + line + "\\n\"\n"); - } - sb.append(" ,\n"); - } - sb.append(" };\n"); - } else { - sb.append(" String[] expectedOpenCL = null;\n"); - } - - String exceptions = source.getExceptionsString(); - if (exceptions.length() > 0) { - sb.append(" Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = "); - - sb.append("com.amd.aparapi.internal.exception." + exceptions + ".class"); - sb.append(";\n"); - } else { - sb.append(" Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = null;\n"); - } - sb.append(" test(" + testPackageName + "." + className + ".class, expectedException, expectedOpenCL);\n"); - sb.append(" }\n"); + appendExpectedOpenCL(source, sb); + appendExpectedExceptions(source, sb); + appendTest(testPackageName, className, "", sb); + appendTest(testPackageName, className, "WorksWithCaching", sb); sb.append("}\n"); // System.out.println(sb.toString()); @@ -124,4 +102,39 @@ public class CreateJUnitTests{ } } + + private static void appendTest(String testPackageName, String className, String suffix, StringBuilder sb) { + sb.append(" @Test public void " + className + suffix + "(){\n"); + sb.append(" test(" + testPackageName + "." + className + ".class, expectedException, expectedOpenCL);\n"); + sb.append(" }\n"); + } + + private static void appendExpectedExceptions(Source source, StringBuilder sb) { + String exceptions = source.getExceptionsString(); + if (exceptions.length() > 0) { + sb.append(" private static final Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = "); + + sb.append("com.amd.aparapi.internal.exception." + exceptions + ".class"); + sb.append(";\n"); + } else { + sb.append(" private static final Class<? extends com.amd.aparapi.internal.exception.AparapiException> expectedException = null;\n"); + } + } + + private static void appendExpectedOpenCL(Source source, StringBuilder sb) { + if (source.getOpenCLSectionCount() > 0) { + + sb.append(" private static final String[] expectedOpenCL = new String[]{\n"); + for (List<String> opencl : source.getOpenCL()) { + sb.append(" \"\"\n"); + for (String line : opencl) { + sb.append(" +\"" + line + "\\n\"\n"); + } + sb.append(" ,\n"); + } + sb.append(" };\n"); + } else { + sb.append(" private static final String[] expectedOpenCL = null;\n"); + } + } } diff --git a/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java b/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java index 3419977fc05ca9f588be573685e3bde9311a1f15..ee9f1515359dfa54dc5d64ee487b55714b38e08c 100644 --- a/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java +++ b/test/runtime/src/java/com/amd/aparapi/test/runtime/Issue103.java @@ -1,7 +1,7 @@ package com.amd.aparapi.test.runtime; import com.amd.aparapi.*; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import org.junit.Test; @@ -19,10 +19,11 @@ public class Issue103 extends Kernel { } void validate() { - for (int i = 0; i < size; i++) { - System.out.println(target[i] + " ... " + source[i]); - assertTrue("target == source", target[i] == source[i]); - } + assertArrayEquals("target == source", target, source); +// for (int i = 0; i < size; i++) { +// System.out.println(target[i] + " ... " + source[i]); +// assertTrue("target == source", target[i] == source[i]); +// } } @Test public void test() { diff --git a/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java b/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java index 3a24b2d275d61e13d4e0dc779e7ee7f8d1b984a2..41f4b0d21e02207f9ad02621c06f2776a67bf5fd 100644 --- a/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java +++ b/test/runtime/src/java/com/amd/aparapi/test/runtime/UseStaticArray.java @@ -1,6 +1,6 @@ package com.amd.aparapi.test.runtime; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import org.junit.Test; import com.amd.aparapi.Kernel; @@ -28,9 +28,10 @@ public class UseStaticArray extends Kernel{ assertTrue("ran on GPU", getExecutionMode() == Kernel.EXECUTION_MODE.GPU); - for (int i = 0; i < size; i++) { - assertTrue("results == fooBar", results[i] == values[i]); - } + assertArrayEquals("results == fooBar", results, values); +// for (int i = 0; i < size; i++) { +// assertTrue("results == fooBar", results[i] == values[i]); +// } } public static void main(String args[]) {