diff options
author | Michael Bien <[email protected]> | 2011-03-29 02:45:16 +0200 |
---|---|---|
committer | Michael Bien <[email protected]> | 2011-03-29 02:45:16 +0200 |
commit | 612fd3e9e9c157cc28d42791fd04711701def6e3 (patch) | |
tree | 45f5ae34d90091945aaa681d2ebb99a3610813a2 /src/com/jogamp/opencl/CLPlatform.java | |
parent | 3e5066589244d812a218433ab25fe6d6f6e1fe84 (diff) |
added CLDeviceFilters utility api.
Diffstat (limited to 'src/com/jogamp/opencl/CLPlatform.java')
-rw-r--r-- | src/com/jogamp/opencl/CLPlatform.java | 105 |
1 files changed, 72 insertions, 33 deletions
diff --git a/src/com/jogamp/opencl/CLPlatform.java b/src/com/jogamp/opencl/CLPlatform.java index 218efed3..f5c94aed 100644 --- a/src/com/jogamp/opencl/CLPlatform.java +++ b/src/com/jogamp/opencl/CLPlatform.java @@ -234,20 +234,7 @@ public final class CLPlatform { for (int i = 0; i < platformId.capacity(); i++) { CLPlatform platform = new CLPlatform(platformId.get(i)); - if(filter == null) { - platforms.add(platform); - }else{ - boolean accepted = true; - for (Filter<CLPlatform> f : filter) { - if(!f.accept(platform)) { - accepted = false; - break; - } - } - if(accepted) { - platforms.add(platform); - } - } + addIfAccepted(platform, platforms, filter); } return platforms.toArray(new CLPlatform[platforms.size()]); @@ -285,38 +272,81 @@ public final class CLPlatform { public CLDevice[] listCLDevices(CLDevice.Type... types) { initialize(); - IntBuffer ib = Buffers.newDirectIntBuffer(1); - List<CLDevice> list = new ArrayList<CLDevice>(); for(int t = 0; t < types.length; t++) { CLDevice.Type type = types[t]; - //find all devices - int ret = cl.clGetDeviceIDs(ID, type.TYPE, 0, null, ib); + PointerBuffer deviceIDs = getDeviceIDs(type.TYPE); - // return an empty array rather than throwing an exception - if(ret == CL.CL_DEVICE_NOT_FOUND || ib.get(0) == 0) { - continue; + //add device to list + for (int n = 0; n < deviceIDs.capacity(); n++) { + list.add(new CLDevice(cl, this, deviceIDs.get(n))); } + } - checkForError(ret, "error while enumerating devices"); + return list.toArray(new CLDevice[list.size()]); - PointerBuffer deviceIDs = PointerBuffer.allocateDirect(ib.get(0)); - ret = cl.clGetDeviceIDs(ID, type.TYPE, deviceIDs.capacity(), deviceIDs, null); - checkForError(ret, "error while enumerating devices"); + } - //add device to list - for (int n = 0; n < deviceIDs.capacity(); n++) - list.add(new CLDevice(cl, this, deviceIDs.get(n))); - } + /** + * Lists all physical devices available on this platform matching the given {@link Filter}. + */ + public CLDevice[] listCLDevices(Filter<CLDevice>... filters) { + initialize(); - CLDevice[] devices = new CLDevice[list.size()]; - for (int i = 0; i < list.size(); i++) { - devices[i] = list.get(i); + List<CLDevice> list = new ArrayList<CLDevice>(); + + PointerBuffer deviceIDs = getDeviceIDs(CL_DEVICE_TYPE_ALL); + + //add device to list + for (int n = 0; n < deviceIDs.capacity(); n++) { + CLDevice device = new CLDevice(cl, this, deviceIDs.get(n)); + addIfAccepted(device, list, filters); } - return devices; + return list.toArray(new CLDevice[list.size()]); + + } + + private PointerBuffer getDeviceIDs(long type) { + + IntBuffer ib = Buffers.newDirectIntBuffer(1); + + //find all devices + int ret = cl.clGetDeviceIDs(ID, type, 0, null, ib); + + PointerBuffer deviceIDs = null; + + // return null rather than throwing an exception + if(ret == CL.CL_DEVICE_NOT_FOUND || ib.get(0) == 0) { + deviceIDs = PointerBuffer.allocate(0); + }else{ + deviceIDs = PointerBuffer.allocateDirect(ib.get(0)); + + checkForError(ret, "error while enumerating devices"); + ret = cl.clGetDeviceIDs(ID, type, deviceIDs.capacity(), deviceIDs, null); + checkForError(ret, "error while enumerating devices"); + } + + return deviceIDs; + } + + private static <I> void addIfAccepted(I item, List<I> list, Filter<I>[] filters) { + if(filters == null) { + list.add(item); + }else{ + boolean accepted = true; + for (Filter<I> filter : filters) { + if(!filter.accept(item)) { + accepted = false; + break; + } + } + if(accepted) { + list.add(item); + } + } } static CLDevice findMaxFlopsDevice(CLDevice[] devices) { @@ -372,6 +402,15 @@ public final class CLPlatform { } /** + * Returns the device with maximal FLOPS and the specified type from this platform. + * The device speed is estimated by calculating the product of + * MAX_COMPUTE_UNITS and MAX_CLOCK_FREQUENCY. + */ + public CLDevice getMaxFlopsDevice(Filter<CLDevice>... filter) { + return findMaxFlopsDevice(listCLDevices(filter)); + } + + /** * Returns the platform name. */ @CLProperty("CL_PLATFORM_NAME") |