summaryrefslogtreecommitdiffstats
path: root/src/com/mbien/opencl/CLContext.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/mbien/opencl/CLContext.java')
-rw-r--r--src/com/mbien/opencl/CLContext.java84
1 files changed, 83 insertions, 1 deletions
diff --git a/src/com/mbien/opencl/CLContext.java b/src/com/mbien/opencl/CLContext.java
index dc3c7279..533d45d4 100644
--- a/src/com/mbien/opencl/CLContext.java
+++ b/src/com/mbien/opencl/CLContext.java
@@ -1,14 +1,18 @@
package com.mbien.opencl;
import com.mbien.opencl.impl.CLImpl;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.IntBuffer;
/**
*
* @author Michael Bien
*/
-public class CLContext {
+public final class CLContext {
private final static CL cl;
+ public final long contextID;
static{
System.loadLibrary("gluegen-rt");
@@ -16,6 +20,84 @@ public class CLContext {
cl = new CLImpl();
}
+ private CLContext(long contextID) {
+ this.contextID = contextID;
+ }
+
+ /**
+ * Creates a default context on all available devices.
+ */
+ public static CLContext create() {
+ IntBuffer ib = IntBuffer.allocate(1);
+ long context = cl.clCreateContextFromType(null, 0, CL.CL_DEVICE_TYPE_ALL, null, null, null, 0);
+
+// int errorCode = ib.get();
+// if(errorCode != CL.CL_SUCCESS)
+// throw new CLException(errorCode, "can not create CL context");
+
+ return new CLContext(context);
+ }
+
+ /**
+ * Creates a default context on the specified device types.
+ */
+ public static CLContext create(CLDevice.Type... deviceTypes) {
+
+ int type = deviceTypes[0].CL_TYPE;
+ for (int i = 1; i < deviceTypes.length; i++) {
+ type |= deviceTypes[i].CL_TYPE;
+ }
+
+ long context = cl.clCreateContextFromType(null, 0, type, null, null, null, 0);
+ return new CLContext(context);
+ }
+
+ /**
+ * Releases the context and all resources.
+ */
+ public void release() {
+ int ret = cl.clReleaseContext(contextID);
+ if(CL.CL_SUCCESS != ret)
+ throw new CLException(ret, "error releasing context");
+ }
+
+ /**
+ * Gets the device with maximal FLOPS from this context.
+ */
+ public CLDevice getMaxFlopsDevice() {
+
+ //TODO not finished
+
+ long[] longBuffer = new long[1];
+// ByteBuffer bb = ByteBuffer.allocate(8);
+// bb.order(ByteOrder.nativeOrder());
+
+ int ret = cl.clGetContextInfo(contextID, CL.CL_CONTEXT_DEVICES, 0, null, longBuffer, 0);
+ if(CL.CL_SUCCESS != ret)
+ throw new CLException(ret, "can not receive context info");
+
+ System.out.println("#devices: "+longBuffer[0]);
+
+ long[] deviceIDs = new long[(int)longBuffer[0]];
+ ret = cl.clGetContextInfo(contextID, CL.CL_CONTEXT_DEVICES, 0, null, deviceIDs, 0);
+
+ if(CL.CL_SUCCESS != ret)
+ throw new CLException(ret, "can not receive context info");
+
+ for (int i = 0; i < deviceIDs.length; i++) {
+ long l = deviceIDs[i];
+ System.out.println("device id"+l);
+ }
+
+ // get the list of GPU devices associated with context
+// ciErrNum = clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, 0, NULL, &dataBytes);
+// cl_device_id *cdDevices = (cl_device_id *)malloc(dataBytes);
+// ciErrNum |= clGetContextInfo(cxGPUContext, CL_CONTEXT_DEVICES, dataBytes, cdDevices, NULL);
+// shrCheckError(ciErrNum, CL_SUCCESS);
+
+ return null;
+ }
+
/**
* Lists all available OpenCL implementaitons.
* @throws CLException if something went wrong initializing OpenCL