diff options
Diffstat (limited to 'src/com/mbien/opencl/CLContext.java')
-rw-r--r-- | src/com/mbien/opencl/CLContext.java | 84 |
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 |