summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nbproject/project.properties2
-rw-r--r--resources/cl-common.cfg7
-rw-r--r--resources/cl-impl.cfg4
-rw-r--r--resources/clImplCustomCode.java6
-rw-r--r--src/com/mbien/opencl/CLCommandQueue.java20
-rw-r--r--src/com/mbien/opencl/CLDevice.java11
-rw-r--r--src/com/mbien/opencl/CLException.java5
-rw-r--r--src/com/mbien/opencl/CLImageFormat.java2
-rw-r--r--src/com/mbien/opencl/CLKernel.java6
-rw-r--r--src/com/mbien/opencl/CLPlatform.java38
-rw-r--r--src/com/mbien/opencl/CLUtils.java4
-rw-r--r--src/com/mbien/opencl/NativeLibLoader.java22
-rw-r--r--test/com/mbien/opencl/CLConcurrencyTest.java4
-rw-r--r--test/com/mbien/opencl/HighLevelBindingTest.java4
14 files changed, 119 insertions, 16 deletions
diff --git a/nbproject/project.properties b/nbproject/project.properties
index eab4a1e4..8622d80a 100644
--- a/nbproject/project.properties
+++ b/nbproject/project.properties
@@ -40,7 +40,7 @@ javac.classpath=\
${file.reference.newt.all.jar}:\
${file.reference.nativewindow.all.jar}
# Space-separated list of extra javac options
-javac.compilerargs=
+javac.compilerargs=-Xlint
javac.deprecation=true
javac.source=1.5
javac.target=1.5
diff --git a/resources/cl-common.cfg b/resources/cl-common.cfg
index 6a42f300..79c2845c 100644
--- a/resources/cl-common.cfg
+++ b/resources/cl-common.cfg
@@ -26,6 +26,10 @@ Ignore CL_LONG_MAX
Ignore CL_LONG_MIN
Ignore CL_ULONG_MAX
+
+#use CLException instead of RunTimeException
+RuntimeExceptionType CLException
+
#enforce client side "good behavior" by generating direct-memory-only bindings for
#performance critical functions.
#NioDirectOnly __ALL__
@@ -78,6 +82,7 @@ NioDirectOnly clWaitForEvents
#extensions
NioDirectOnly clGetGLContextInfoKHR
+
#common rename emitted struct accessors
#struct cl_image_format
RenameJavaType cl_image_format CLImageFormatImpl
@@ -87,10 +92,12 @@ StructPackage cl_image_format com.mbien.opencl.impl
RenameJavaMethod image_channel_order imageChannelOrder
RenameJavaMethod image_channel_data_type imageChannelDataType
+
ClassJavadoc CLImageFormatImpl /**
ClassJavadoc CLImageFormatImpl * Struct accessor for cl_image_format.
ClassJavadoc CLImageFormatImpl * @author Michael Bien
ClassJavadoc CLImageFormatImpl */
+
# Pick up on-line OpenCL doc and link it with the javadoc
TagNativeBinding true \ No newline at end of file
diff --git a/resources/cl-impl.cfg b/resources/cl-impl.cfg
index ec2718df..ac67e482 100644
--- a/resources/cl-impl.cfg
+++ b/resources/cl-impl.cfg
@@ -22,6 +22,10 @@ GetProcAddressTableExpr addressTable
ProcAddressNameExpr $UpperCase(arg)
ForceProcAddressGen clGetGLContextInfoKHR
+Unignore clGetExtensionFunctionAddress
+#AccessControl clGetExtensionFunctionAddress PACKAGE_PRIVATE
+ArgumentIsString clGetExtensionFunctionAddress 0
+
#append to generated c files
CustomCCode #include <CL/cl.h>
CustomCCode #include <GL3/gl3.h>
diff --git a/resources/clImplCustomCode.java b/resources/clImplCustomCode.java
index 6ee9193b..814bb219 100644
--- a/resources/clImplCustomCode.java
+++ b/resources/clImplCustomCode.java
@@ -1,5 +1,9 @@
- CLProcAddressTable addressTable = new CLProcAddressTable();
+ final static CLProcAddressTable addressTable = new CLProcAddressTable();
+
+// static{
+// ProcAddressHelper.resetProcAddressTable(addressTable, );
+// }
public long clCreateContext(PointerBuffer properties, PointerBuffer devices, CreateContextCallback pfn_notify, Object userData, IntBuffer errcode_ret) {
diff --git a/src/com/mbien/opencl/CLCommandQueue.java b/src/com/mbien/opencl/CLCommandQueue.java
index d7586a93..0967a27b 100644
--- a/src/com/mbien/opencl/CLCommandQueue.java
+++ b/src/com/mbien/opencl/CLCommandQueue.java
@@ -20,9 +20,11 @@ import static com.mbien.opencl.CL.*;
public class CLCommandQueue implements CLResource {
public final long ID;
+
private final CLContext context;
private final CLDevice device;
private final CL cl;
+ private long properties;
/*
* Those direct memory buffers are used to pass data between the JVM and OpenCL.
@@ -35,6 +37,7 @@ public class CLCommandQueue implements CLResource {
this.context = context;
this.cl = context.cl;
this.device = device;
+ this.properties = properties;
this.bufferA = PointerBuffer.allocateDirect(3);
this.bufferB = PointerBuffer.allocateDirect(3);
@@ -450,7 +453,7 @@ public class CLCommandQueue implements CLResource {
if(localWorkSizeX != 0 && localWorkSizeY !=0) {
localWorkSize = copy2NIO(bufferC, localWorkSizeX, localWorkSizeY);
}
- this.putNDRangeKernel(kernel, 2, globalWorkOffset, globalWorkSize, localWorkSize);
+ this.putNDRangeKernel(kernel, 2, globalWorkOffset, globalWorkSize, localWorkSize, events);
return this;
}
@@ -525,13 +528,26 @@ public class CLCommandQueue implements CLResource {
return this;
}
-
public CLCommandQueue finish() {
int ret = cl.clFinish(ID);
checkForError(ret, "can not finish command queue");
return this;
}
+ /**
+ * Returns true only when {@link Mode#PROFILING_MODE} has been enabled.
+ */
+ public boolean isProfilingEnabled() {
+ return (Mode.PROFILING_MODE.QUEUE_MODE & properties) != 0;
+ }
+
+ /**
+ * Returns true only when {@link Mode#OUT_OF_ORDER_EXEC_MODE} mode has been enabled.
+ */
+ public boolean isOutOfOrderModeEnabled() {
+ return (Mode.OUT_OF_ORDER_EXEC_MODE.QUEUE_MODE & properties) != 0;
+ }
+
public void release() {
int ret = cl.clReleaseCommandQueue(ID);
context.onCommandQueueReleased(device, this);
diff --git a/src/com/mbien/opencl/CLDevice.java b/src/com/mbien/opencl/CLDevice.java
index e754a4bc..c6134248 100644
--- a/src/com/mbien/opencl/CLDevice.java
+++ b/src/com/mbien/opencl/CLDevice.java
@@ -263,14 +263,14 @@ public final class CLDevice {
/**
* Returns the size of global memory cache line in bytes.
*/
- public long getGlobalMemCachlineSize() {
+ public long getGlobalMemCachelineSize() {
return deviceInfo.getLong(CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE);
}
/**
* Returns the size of global memory cache in bytes.
*/
- public long getGlobalMemCachSize() {
+ public long getGlobalMemCacheSize() {
return deviceInfo.getLong(CL_DEVICE_GLOBAL_MEM_CACHE_SIZE);
}
@@ -466,6 +466,13 @@ public final class CLDevice {
}
/**
+ * Returns true if the extension is supported on this device.
+ */
+ public boolean isExtensionAvailable(String extension) {
+ return getExtensions().contains(extension);
+ }
+
+ /**
* Returns all device extension names as unmodifiable Set.
*/
public Set<String> getExtensions() {
diff --git a/src/com/mbien/opencl/CLException.java b/src/com/mbien/opencl/CLException.java
index 3703f235..4ca216c4 100644
--- a/src/com/mbien/opencl/CLException.java
+++ b/src/com/mbien/opencl/CLException.java
@@ -12,6 +12,11 @@ public class CLException extends RuntimeException {
private final static String ERROR_CODE_DOC = "http://www.khronos.org/opencl/sdk/1.0/docs/man/xhtml/errors.html";
+ public CLException(String message) {
+ super(message);
+ errorcode = 0;
+ }
+
public CLException(int error, String message) {
super(message + "\nerror: " + identifyError(error) + " (man page: "+ERROR_CODE_DOC+")");
errorcode = error;
diff --git a/src/com/mbien/opencl/CLImageFormat.java b/src/com/mbien/opencl/CLImageFormat.java
index b5551798..d2625f7f 100644
--- a/src/com/mbien/opencl/CLImageFormat.java
+++ b/src/com/mbien/opencl/CLImageFormat.java
@@ -172,7 +172,7 @@ public final class CLImageFormat {
/**
* Represents a normalized 5-6-5 3-channel RGB image. The channel order must
- * be {@link ChannelOrder#CL_RGB}.
+ * be {@link ChannelOrder#RGB}.
*/
UNORM_SHORT_565(CL_UNORM_SHORT_565),
diff --git a/src/com/mbien/opencl/CLKernel.java b/src/com/mbien/opencl/CLKernel.java
index cb03cf8e..0dc9db19 100644
--- a/src/com/mbien/opencl/CLKernel.java
+++ b/src/com/mbien/opencl/CLKernel.java
@@ -12,11 +12,11 @@ import static com.mbien.opencl.CL.*;
/**
* High level abstraction for an OpenCL Kernel.
- * CLKernel is not threadsafe.
- * "A kernel is a function declared in a program. A kernel is identified by the <code>kernel</code> qualifier
+ * A kernel is a function declared in a program. A kernel is identified by the <code>kernel</code> qualifier
* applied to any function in a program. A kernel object encapsulates the specific <code>kernel</code>
* function declared in a program and the argument values to be used when executing this
- * <code>kernel</code> function."
+ * <code>kernel</code> function.
+ * CLKernel is not threadsafe.
* @author Michael Bien
*/
public class CLKernel implements CLResource/*, Cloneable*/ {
diff --git a/src/com/mbien/opencl/CLPlatform.java b/src/com/mbien/opencl/CLPlatform.java
index fc1b78f3..2f3cbf54 100644
--- a/src/com/mbien/opencl/CLPlatform.java
+++ b/src/com/mbien/opencl/CLPlatform.java
@@ -2,9 +2,14 @@ package com.mbien.opencl;
import com.mbien.opencl.impl.CLImpl;
import com.sun.gluegen.runtime.PointerBuffer;
+import com.sun.gluegen.runtime.ProcAddressHelper;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Scanner;
+import java.util.Set;
import static com.mbien.opencl.CLException.*;
import static com.mbien.opencl.CL.*;
@@ -22,9 +27,12 @@ public final class CLPlatform {
private static final CL cl;
+ private Set<String> extensions;
+
static{
- System.loadLibrary("gluegen-rt");
- System.loadLibrary("jocl");
+ NativeLibLoader.loadJOCL();
+// System.loadLibrary("gluegen-rt");
+// ProcAddressHelper.resetProcAddressTable(table, null);
cl = new CLImpl();
}
@@ -186,6 +194,32 @@ public final class CLPlatform {
}
/**
+ * Returns true if the extension is supported on this platform.
+ */
+ public boolean isExtensionAvailable(String extension) {
+ return getExtensions().contains(extension);
+ }
+
+ /**
+ * Returns all platform extension names as unmodifiable Set.
+ */
+ public Set<String> getExtensions() {
+
+ if(extensions == null) {
+ extensions = new HashSet<String>();
+ String ext = getInfoString(CL_PLATFORM_EXTENSIONS);
+ Scanner scanner = new Scanner(ext);
+
+ while(scanner.hasNext())
+ extensions.add(scanner.next());
+
+ extensions = Collections.unmodifiableSet(extensions);
+ }
+
+ return extensions;
+ }
+
+ /**
* Returns a info string in exchange for a key (CL_PLATFORM_*).
*/
public String getInfoString(int key) {
diff --git a/src/com/mbien/opencl/CLUtils.java b/src/com/mbien/opencl/CLUtils.java
index eb66a7a3..03fb559c 100644
--- a/src/com/mbien/opencl/CLUtils.java
+++ b/src/com/mbien/opencl/CLUtils.java
@@ -32,6 +32,7 @@ class CLUtils {
map.put("CL_PLATFORM_PROFILE", platform.getProfile());
map.put("CL_PLATFORM_VERSION", platform.getVersion());
map.put("CL_PLATFORM_VENDOR", platform.getVendor());
+ map.put("CL_PLATFORM_EXTENSIONS", platform.getExtensions().toString());
// map.put("fastest device (estimated)", platform.getMaxFlopsDevice().toString());
return map;
@@ -53,7 +54,8 @@ class CLUtils {
map.put("CL_DEVICE_MAX_PARAMETER_SIZE", dev.getMaxParameterSize()+" Byte");
map.put("CL_DEVICE_LOCAL_MEM_SIZE", dev.getLocalMemSize()/1024+" KB");
map.put("CL_DEVICE_LOCAL_MEM_TYPE", dev.getLocalMemType()+"");
- map.put("CL_DEVICE_GLOBAL_MEM_CACHE_SIZE", dev.getGlobalMemCachSize()+"");
+ map.put("CL_DEVICE_GLOBAL_MEM_CACHE_SIZE", dev.getGlobalMemCacheSize()+"");
+ map.put("CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE", dev.getGlobalMemCachelineSize()+"");
map.put("CL_DEVICE_GLOBAL_MEM_CACHE_TYPE", dev.getGlobalMemCacheType()+"");
map.put("CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE", dev.getMaxConstantBufferSize()+"");
map.put("CL_DEVICE_MAX_CONSTANT_ARGS", dev.getMaxConstantArgs()+"");
diff --git a/src/com/mbien/opencl/NativeLibLoader.java b/src/com/mbien/opencl/NativeLibLoader.java
new file mode 100644
index 00000000..b8148432
--- /dev/null
+++ b/src/com/mbien/opencl/NativeLibLoader.java
@@ -0,0 +1,22 @@
+package com.mbien.opencl;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import com.sun.nativewindow.impl.NativeLibLoaderBase;
+
+/**
+ *
+ * @author Michael Bien
+ */
+class NativeLibLoader extends NativeLibLoaderBase {
+
+ @SuppressWarnings("unchecked")
+ public static void loadJOCL() {
+ AccessController.doPrivileged(new PrivilegedAction() {
+ public Object run() {
+ loadLibrary("jocl", null, true);
+ return null;
+ }
+ });
+ }
+}
diff --git a/test/com/mbien/opencl/CLConcurrencyTest.java b/test/com/mbien/opencl/CLConcurrencyTest.java
index 94e8c4ee..e7a244c3 100644
--- a/test/com/mbien/opencl/CLConcurrencyTest.java
+++ b/test/com/mbien/opencl/CLConcurrencyTest.java
@@ -19,7 +19,7 @@ public class CLConcurrencyTest {
@Test
public void testEvents() throws IOException {
- out.println(" - - - event synchronisation test - - - ");
+ out.println(" - - - event synchronization test - - - ");
final int groupSize = 256;
final int elements = roundUp(groupSize, ONE_MB/SIZEOF_INT * 5); // 5MB per buffer
@@ -82,7 +82,7 @@ public class CLConcurrencyTest {
@Test
public void concurrencyTest() throws IOException, InterruptedException {
- out.println(" - - - queue synchronisation test - - - ");
+ out.println(" - - - QueueBarrier test - - - ");
final int elements = ONE_MB/SIZEOF_INT * 10; // 20MB per buffer
diff --git a/test/com/mbien/opencl/HighLevelBindingTest.java b/test/com/mbien/opencl/HighLevelBindingTest.java
index 6ae9ac7e..9c0e2343 100644
--- a/test/com/mbien/opencl/HighLevelBindingTest.java
+++ b/test/com/mbien/opencl/HighLevelBindingTest.java
@@ -58,6 +58,7 @@ public class HighLevelBindingTest {
out.println(" version: "+platform.getVersion());
out.println(" vendor: "+platform.getVendor());
out.println(" max FLOPS device: "+platform.getMaxFlopsDevice());
+ out.println(" extensions: "+platform.getExtensions());
CLDevice[] clDevices = platform.listCLDevices();
for (CLDevice device : clDevices) {
@@ -74,7 +75,8 @@ public class HighLevelBindingTest {
out.println(" max param size: "+device.getMaxParameterSize()+" byte");
out.println(" local mem: "+device.getLocalMemSize()/1024+" KB");
out.println(" local mem type: "+device.getLocalMemType());
- out.println(" global mem cache size: "+device.getGlobalMemCachSize());
+ out.println(" global mem cache size: "+device.getGlobalMemCacheSize());
+ out.println(" global mem cacheline size: "+device.getGlobalMemCachelineSize());
out.println(" global mem cache type: "+device.getGlobalMemCacheType());
out.println(" constant buffer size: "+device.getMaxConstantBufferSize());
out.println(" error correction support: "+device.isErrorCorrectionSupported());