summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Bien <[email protected]>2010-02-13 16:20:34 +0100
committerMichael Bien <[email protected]>2010-02-13 16:20:34 +0100
commit62d9a63caad9d614a4a4ca90956b38ff623242a5 (patch)
treee90d8726cbd815bc7bfadea1c91ac4f6cb63bbd4
parenta93e4532f9515f5b2c0d2c67a45db1236a29ab12 (diff)
added a few tests for event profiling and enums.
fixed bug in LocalMemType and Mem enum valueOf(int foo) methods.
-rw-r--r--src/com/mbien/opencl/CLDevice.java4
-rw-r--r--src/com/mbien/opencl/CLMemory.java2
-rw-r--r--test/com/mbien/opencl/CLCommandQueueTest.java (renamed from test/com/mbien/opencl/CLConcurrencyTest.java)170
-rw-r--r--test/com/mbien/opencl/CLProgramTest.java14
-rw-r--r--test/com/mbien/opencl/HighLevelBindingTest.java41
5 files changed, 168 insertions, 63 deletions
diff --git a/src/com/mbien/opencl/CLDevice.java b/src/com/mbien/opencl/CLDevice.java
index d6013166..cd569586 100644
--- a/src/com/mbien/opencl/CLDevice.java
+++ b/src/com/mbien/opencl/CLDevice.java
@@ -746,9 +746,9 @@ public final class CLDevice {
*/
public static LocalMemType valueOf(int clLocalCacheType) {
if(clLocalCacheType == CL_GLOBAL)
- return LOCAL;
- else if(clLocalCacheType == CL_LOCAL)
return GLOBAL;
+ else if(clLocalCacheType == CL_LOCAL)
+ return LOCAL;
return null;
}
diff --git a/src/com/mbien/opencl/CLMemory.java b/src/com/mbien/opencl/CLMemory.java
index 2b7e847a..296f16f5 100644
--- a/src/com/mbien/opencl/CLMemory.java
+++ b/src/com/mbien/opencl/CLMemory.java
@@ -202,6 +202,8 @@ public abstract class CLMemory <B extends Buffer> implements CLResource {
return Mem.READ_WRITE;
case CL_MEM_READ_ONLY:
return Mem.READ_ONLY;
+ case CL_MEM_WRITE_ONLY:
+ return Mem.WRITE_ONLY;
case CL_MEM_USE_HOST_PTR:
return Mem.USE_BUFFER;
case(CL_MEM_ALLOC_HOST_PTR):
diff --git a/test/com/mbien/opencl/CLConcurrencyTest.java b/test/com/mbien/opencl/CLCommandQueueTest.java
index e7a244c3..b52ef5ed 100644
--- a/test/com/mbien/opencl/CLConcurrencyTest.java
+++ b/test/com/mbien/opencl/CLCommandQueueTest.java
@@ -1,52 +1,82 @@
package com.mbien.opencl;
+import com.mbien.opencl.CLCommandQueue.Mode;
import com.mbien.opencl.CLMemory.Mem;
import java.io.IOException;
import java.nio.ByteBuffer;
+import java.util.EnumSet;
import org.junit.Test;
import static org.junit.Assert.*;
import static java.lang.System.*;
import static com.mbien.opencl.TestUtils.*;
+import static com.mbien.opencl.CLEvent.*;
import static com.sun.gluegen.runtime.BufferFactory.*;
/**
*
* @author Michael Bien
*/
-public class CLConcurrencyTest {
+public class CLCommandQueueTest {
- @Test
- public void testEvents() throws IOException {
+ private final int groupSize = 256;
+
+ @Test
+ public void enumsTest() {
+
+ //CLCommandQueueEnums
+ EnumSet<Mode> queueMode = Mode.valuesOf(CL.CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL.CL_QUEUE_PROFILING_ENABLE);
+ assertTrue(queueMode.contains(Mode.OUT_OF_ORDER_EXEC_MODE));
+ assertTrue(queueMode.contains(Mode.PROFILING_MODE));
+
+ assertNotNull(Mode.valuesOf(0));
+ assertEquals(0, Mode.valuesOf(0).size());
+ for (Mode mode : Mode.values()) {
+ assertEquals(mode, Mode.valueOf(mode.QUEUE_MODE));
+ }
+
+ // CLEvent enums
+ for (ProfilingCommand cmd : ProfilingCommand.values()) {
+ assertEquals(cmd, ProfilingCommand.valueOf(cmd.COMMAND));
+ }
+
+ for (CommandType type : CommandType.values()) {
+ assertEquals(type, CommandType.valueOf(type.TYPE));
+ }
+
+ for (ExecutionStatus status : ExecutionStatus.values()) {
+ assertEquals(status, ExecutionStatus.valueOf(status.STATUS));
+ }
+
+ }
+
+ @Test
+ public void eventsTest() throws IOException {
out.println(" - - - event synchronization test - - - ");
- final int groupSize = 256;
- final int elements = roundUp(groupSize, ONE_MB/SIZEOF_INT * 5); // 5MB per buffer
+ final int elements = roundUp(groupSize, ONE_MB / SIZEOF_INT * 5); // 5MB per buffer
CLContext context = CLContext.create();
- CLBuffer<ByteBuffer> clBufferA = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- CLBuffer<ByteBuffer> clBufferB = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- CLBuffer<ByteBuffer> clBufferC = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- CLBuffer<ByteBuffer> clBufferD = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
+ CLBuffer<ByteBuffer> clBufferA = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ CLBuffer<ByteBuffer> clBufferB = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ CLBuffer<ByteBuffer> clBufferC = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ CLBuffer<ByteBuffer> clBufferD = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
fillBuffer(clBufferA.buffer, 12345);
fillBuffer(clBufferB.buffer, 67890);
CLProgram program = context.createProgram(getClass().getResourceAsStream("testkernels.cl")).build();
-
- CLKernel vectorAddKernel = program.createCLKernel("VectorAddGM")
- .setArg(3, elements);
-
+ CLKernel vectorAddKernel = program.createCLKernel("VectorAddGM").setArg(3, elements);
CLCommandQueue queue = context.getCLDevices()[0].createCommandQueue();
final CLEventList events = new CLEventList(2);
-
+
assertEquals(0, events.size());
- queue.putWriteBuffer(clBufferA, false, events) // write A
- .putWriteBuffer(clBufferB, false, events); // write B
+ queue.putWriteBuffer(clBufferA, false, events) // write A
+ .putWriteBuffer(clBufferB, false, events);// write B
assertEquals(2, events.size());
queue.putWaitForEvents(events, true);
@@ -70,56 +100,100 @@ public class CLConcurrencyTest {
events.release();
checkIfEqual(clBufferC.buffer, clBufferD.buffer, elements);
-
+
context.release();
out.println("results are valid");
- }
+ }
+ @Test
+ public void profilingEventsTest() throws IOException {
+
+ out.println(" - - - event synchronization test - - - ");
+
+ final int elements = roundUp(groupSize, ONE_MB / SIZEOF_INT * 5); // 5MB per buffer
+
+ CLContext context = CLContext.create();
+
+ CLBuffer<ByteBuffer> clBufferA = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ CLBuffer<ByteBuffer> clBufferB = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ CLBuffer<ByteBuffer> clBufferC = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+
+ fillBuffer(clBufferA.buffer, 12345);
+ fillBuffer(clBufferB.buffer, 67890);
+
+ CLProgram program = context.createProgram(getClass().getResourceAsStream("testkernels.cl")).build();
+ CLKernel vectorAddKernel = program.createCLKernel("VectorAddGM").setArg(3, elements);
+ CLCommandQueue queue = context.getCLDevices()[0].createCommandQueue(Mode.PROFILING_MODE);
- @Test
- public void concurrencyTest() throws IOException, InterruptedException {
+ queue.putWriteBuffer(clBufferA, true) // write A
+ .putWriteBuffer(clBufferB, true);// write B
+
+ final CLEventList events = new CLEventList(1);
+
+ assertEquals(0, events.size());
+
+ vectorAddKernel.setArgs(clBufferA, clBufferB, clBufferC); // C = A+B
+ queue.put1DRangeKernel(vectorAddKernel, 0, elements, groupSize, events);
+
+ assertEquals(1, events.size());
+ CLEvent probe = events.getEvent(0);
+ out.println(probe);
+
+ queue.putWaitForEvents(events, true);
+ assertEquals(CLEvent.ExecutionStatus.COMPLETE, probe.getStatus());
+
+ out.println(probe);
+ long time = probe.getProfilingInfo(CLEvent.ProfilingCommand.END)
+ - probe.getProfilingInfo(CLEvent.ProfilingCommand.START);
+ out.println("time: "+time);
+ assertTrue(time > 0);
+
+ events.release();
+ context.release();
+
+ }
+
+ @Test
+ public void concurrencyTest() throws IOException, InterruptedException {
out.println(" - - - QueueBarrier test - - - ");
- final int elements = ONE_MB/SIZEOF_INT * 10; // 20MB per buffer
+ final int elements = ONE_MB / SIZEOF_INT * 10; // 20MB per buffer
CLContext context = CLContext.create();
CLDevice[] devices = context.getCLDevices();
- if(devices.length < 2) {
+ if (devices.length < 2) {
out.println("aborting test... need at least 2 devices");
context.release();
return;
}
- final CLBuffer<ByteBuffer> clBufferC = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- final CLBuffer<ByteBuffer> clBufferD = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
+ final CLBuffer<ByteBuffer> clBufferC = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ final CLBuffer<ByteBuffer> clBufferD = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
- final CLBuffer<ByteBuffer> clBufferA1 = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- final CLBuffer<ByteBuffer> clBufferB1 = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- final CLBuffer<ByteBuffer> clBufferA2 = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
- final CLBuffer<ByteBuffer> clBufferB2 = context.createByteBuffer(elements*SIZEOF_INT, Mem.READ_ONLY);
+ final CLBuffer<ByteBuffer> clBufferA1 = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ final CLBuffer<ByteBuffer> clBufferB1 = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ final CLBuffer<ByteBuffer> clBufferA2 = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
+ final CLBuffer<ByteBuffer> clBufferB2 = context.createByteBuffer(elements * SIZEOF_INT, Mem.READ_ONLY);
CLProgram program = context.createProgram(getClass().getResourceAsStream("testkernels.cl")).build();
- final CLKernel vectorAddKernel1 = program.createCLKernel("VectorAddGM")
- .setArg(3, elements);
-
- final CLKernel vectorAddKernel2 = program.createCLKernel("VectorAddGM")
- .setArg(3, elements);
-
+ final CLKernel vectorAddKernel1 = program.createCLKernel("VectorAddGM").setArg(3, elements);
+ final CLKernel vectorAddKernel2 = program.createCLKernel("VectorAddGM").setArg(3, elements);
int secondDevice = devices.length > 1 ? 1 : 0;
final CLCommandQueue queue1 = devices[0 ].createCommandQueue();
final CLCommandQueue queue2 = devices[secondDevice].createCommandQueue();
- if(secondDevice > 0)
- System.out.println("using two devices");
+ if (secondDevice > 0) {
+ System.out.println("using two devices");
+ }
final QueueBarrier barrier = new QueueBarrier(2);
@@ -132,21 +206,20 @@ public class CLConcurrencyTest {
fillBuffer(clBufferB1.buffer, 67890);
// System.out.println("C buffer");
- queue1.putWriteBuffer(clBufferA1, false) // write A
- .putWriteBuffer(clBufferB1, true); // write B
+ queue1.putWriteBuffer(clBufferA1, false) // write A
+ .putWriteBuffer(clBufferB1, true); // write B
// System.out.println("C args");
vectorAddKernel1.setArgs(clBufferA1, clBufferB1, clBufferC); // C = A+B
// System.out.println("C kernels");
CLEventList events1 = new CLEventList(2);
- queue1.put1DRangeKernel(vectorAddKernel1, 0, elements, 256, events1)
+ queue1.put1DRangeKernel(vectorAddKernel1, 0, elements, groupSize, events1)
.putReadBuffer(clBufferC, false, events1);
barrier.waitFor(queue1, events1);
}
-
};
Thread thread2 = new Thread("D") {
@@ -156,10 +229,10 @@ public class CLConcurrencyTest {
fillBuffer(clBufferA2.buffer, 12345);
fillBuffer(clBufferB2.buffer, 67890);
-
+
// System.out.println("D buffer");
- queue2.putWriteBuffer(clBufferA2, false) // write A
- .putWriteBuffer(clBufferB2, true); // write B
+ queue2.putWriteBuffer(clBufferA2, false) // write A
+ .putWriteBuffer(clBufferB2, true); // write B
// System.out.println("D args");
vectorAddKernel2.setArgs(clBufferA2, clBufferB2, clBufferD); // D = A+B
@@ -172,7 +245,6 @@ public class CLConcurrencyTest {
barrier.waitFor(queue2, events2);
}
-
};
out.println("starting threads");
@@ -185,13 +257,7 @@ public class CLConcurrencyTest {
context.release();
-// vectorAddKernel2.release();
-
out.println("results are valid");
- }
-
-
-
-
-} \ No newline at end of file
+ }
+}
diff --git a/test/com/mbien/opencl/CLProgramTest.java b/test/com/mbien/opencl/CLProgramTest.java
index 01fc1504..84e0eed5 100644
--- a/test/com/mbien/opencl/CLProgramTest.java
+++ b/test/com/mbien/opencl/CLProgramTest.java
@@ -1,5 +1,6 @@
package com.mbien.opencl;
+import com.mbien.opencl.CLProgram.Status;
import java.io.IOException;
import java.util.Map;
import org.junit.Test;
@@ -7,6 +8,7 @@ import org.junit.Test;
import static org.junit.Assert.*;
import static java.lang.System.*;
import static com.mbien.opencl.CLProgram.CompilerOptions.*;
+import static com.mbien.opencl.CLProgram.Status.*;
/**
*
@@ -15,6 +17,15 @@ import static com.mbien.opencl.CLProgram.CompilerOptions.*;
public class CLProgramTest {
@Test
+ public void enumsTest() {
+
+ // CLProgram enums
+ for (Status e : Status.values()) {
+ assertEquals(e, Status.valueOf(e.STATUS));
+ }
+ }
+
+ @Test
public void rebuildProgramTest() throws IOException {
out.println(" - - - CLProgramTest; rebuild program test - - - ");
@@ -116,7 +127,8 @@ public class CLProgramTest {
assertEquals(program.getSource().length(), 0);
try{
- program.createCLKernels();
+ Map<String, CLKernel> kernels = program.createCLKernels();
+ fail("expected an exception from createCLKernels but got: "+kernels);
}catch(CLException ex) {
// expected, not build yet
}
diff --git a/test/com/mbien/opencl/HighLevelBindingTest.java b/test/com/mbien/opencl/HighLevelBindingTest.java
index ec3586d7..21014e8a 100644
--- a/test/com/mbien/opencl/HighLevelBindingTest.java
+++ b/test/com/mbien/opencl/HighLevelBindingTest.java
@@ -3,6 +3,9 @@ package com.mbien.opencl;
import com.mbien.opencl.CLMemory.Mem;
import com.mbien.opencl.CLCommandQueue.Mode;
import com.mbien.opencl.CLDevice.FPConfig;
+import com.mbien.opencl.CLDevice.GlobalMemCacheType;
+import com.mbien.opencl.CLDevice.LocalMemType;
+import com.mbien.opencl.CLDevice.Type;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Arrays;
@@ -31,20 +34,42 @@ public class HighLevelBindingTest {
}
@Test
- public void contextlessTest() {
-
- out.println(" - - - highLevelTest; contextless - - - ");
-
+ public void enumsTest() {
+
// enum tests
final EnumSet<FPConfig> singleFPConfig = FPConfig.valuesOf(CL.CL_FP_DENORM | CL.CL_FP_ROUND_TO_INF);
assertEquals(0, FPConfig.valuesOf(0).size());
assertTrue(singleFPConfig.contains(FPConfig.DENORM));
assertTrue(singleFPConfig.contains(FPConfig.ROUND_TO_INF));
- final EnumSet<Mode> queueMode = Mode.valuesOf(CL.CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE | CL.CL_QUEUE_PROFILING_ENABLE);
- assertEquals(0, Mode.valuesOf(0).size());
- assertTrue(queueMode.contains(Mode.OUT_OF_ORDER_EXEC_MODE));
- assertTrue(queueMode.contains(Mode.PROFILING_MODE));
+ // CLDevice enums
+ for (FPConfig e : FPConfig.values()) {
+ EnumSet<FPConfig> set = FPConfig.valuesOf(e.CONFIG);
+ assertTrue(set.contains(e));
+ }
+ for (GlobalMemCacheType e : GlobalMemCacheType.values()) {
+ assertEquals(e, GlobalMemCacheType.valueOf(e.TYPE));
+ }
+ for (LocalMemType e : LocalMemType.values()) {
+ assertEquals(e, LocalMemType.valueOf(e.TYPE));
+ }
+ for (Type e : Type.values()) {
+ assertEquals(e, Type.valueOf(e.TYPE));
+ }
+
+ // CLMemory enums
+ for (Mem e : Mem.values()) {
+ assertEquals(e, Mem.valueOf(e.CONFIG));
+ }
+
+ }
+
+
+
+ @Test
+ public void contextlessTest() {
+
+ out.println(" - - - highLevelTest; contextless - - - ");
// platform/device info tests
CLPlatform[] clPlatforms = CLPlatform.listCLPlatforms();