diff options
Diffstat (limited to 'src/com/mbien')
-rw-r--r-- | src/com/mbien/opencl/CLContext.java | 61 | ||||
-rw-r--r-- | src/com/mbien/opencl/CLDevice.java | 22 |
2 files changed, 70 insertions, 13 deletions
diff --git a/src/com/mbien/opencl/CLContext.java b/src/com/mbien/opencl/CLContext.java index 81ac58f0..68ff131c 100644 --- a/src/com/mbien/opencl/CLContext.java +++ b/src/com/mbien/opencl/CLContext.java @@ -66,29 +66,44 @@ public final class CLContext { } /** - * Creates a default context on all available devices (CL_DEVICE_TYPE_ALL). + * Creates a context on all available devices (CL_DEVICE_TYPE_ALL). * The platform to be used is implementation dependent. */ public static final CLContext create() { - return createContext(null, CL.CL_DEVICE_TYPE_ALL); + return createContextFromType(null, CL.CL_DEVICE_TYPE_ALL); } /** - * Creates a default context on the specified device types. + * Creates a context on the specified device types. * The platform to be used is implementation dependent. */ public static final CLContext create(CLDevice.Type... deviceTypes) { return create(null, deviceTypes); } + /** + * Creates a context on the specified devices. + * The platform to be used is implementation dependent. + */ + public static final CLContext create(CLDevice... devices) { + return create(null, devices); + } + + /** + * Creates a context on the specified platform on all available devices (CL_DEVICE_TYPE_ALL). + */ + public static final CLContext create(CLPlatform platform) { + return create(platform, CLDevice.Type.ALL); + } + // TODO check if driver bug, otherwise find the reason why this is not working (INVALID_VALUE with NV driver) /** - * Creates a default context on the specified platform and with the specified + * Creates a context on the specified platform and with the specified * device types. */ private static final CLContext create(CLPlatform platform, CLDevice.Type... deviceTypes) { - int type = 0; + long type = 0; if(deviceTypes != null) { for (int i = 0; i < deviceTypes.length; i++) { type |= deviceTypes[i].CL_TYPE; @@ -102,10 +117,32 @@ public final class CLContext { properties.rewind(); } - return createContext(properties, type); + return createContextFromType(properties, type); + } + + /** + * Creates a context on the specified platform and with the specified + * devices. + */ + private static final CLContext create(CLPlatform platform, CLDevice... devices) { + + long[] deviceIDs = new long[devices.length]; + + for (int i = 0; i < devices.length; i++) { + deviceIDs[i] = devices[i].ID; + } + + IntBuffer properties = null; + if(platform != null) { + properties = IntBuffer.allocate(3); + properties.put(CL.CL_CONTEXT_PLATFORM).put((int)platform.ID).put(0); // TODO check if this has to be int or long + properties.rewind(); + } + + return createContext(properties, deviceIDs); } - private static final CLContext createContext(IntBuffer properties, long deviceType) { + private static final CLContext createContextFromType(IntBuffer properties, long deviceType) { IntBuffer status = IntBuffer.allocate(1); long context = CLPlatform.getLowLevelBinding().clCreateContextFromType(properties, deviceType, null, null, status); @@ -115,6 +152,16 @@ public final class CLContext { return new CLContext(context); } + private static final CLContext createContext(IntBuffer properties, long[] devices) { + + IntBuffer status = IntBuffer.allocate(1); + long context = CLPlatform.getLowLevelBinding().clCreateContext(properties, devices, null, null, status); + + checkForError(status.get(), "can not create CL context"); + + return new CLContext(context); + } + /** * Creates a program from the given sources, the program is not build yet. */ diff --git a/src/com/mbien/opencl/CLDevice.java b/src/com/mbien/opencl/CLDevice.java index 0ad8f0e9..de49aafa 100644 --- a/src/com/mbien/opencl/CLDevice.java +++ b/src/com/mbien/opencl/CLDevice.java @@ -255,21 +255,31 @@ public final class CLDevice { */ ACCELERATOR(CL.CL_DEVICE_TYPE_ACCELERATOR), /** - * CL_DEVICE_TYPE_DEFAULT + * CL_DEVICE_TYPE_DEFAULT. This type can be used for creating a context on + * the default device, a single device can never have this type. */ - DEFAULT(CL.CL_DEVICE_TYPE_DEFAULT); + DEFAULT(CL.CL_DEVICE_TYPE_DEFAULT), + /** + * CL_DEVICE_TYPE_ALL. This type can be used for creating a context on + * all devices, a single device can never have this type. + */ + ALL(CL.CL_DEVICE_TYPE_ALL); /** * Value of wrapped OpenCL device type. */ - public final int CL_TYPE; + public final long CL_TYPE; - private Type(int CL_TYPE) { + private Type(long CL_TYPE) { this.CL_TYPE = CL_TYPE; } - public static Type valueOf(int clDeviceType) { - switch(clDeviceType) { + public static Type valueOf(long clDeviceType) { + + if(clDeviceType == CL.CL_DEVICE_TYPE_ALL) + return ALL; + + switch((int)clDeviceType) { case(CL.CL_DEVICE_TYPE_DEFAULT): return DEFAULT; case(CL.CL_DEVICE_TYPE_CPU): |