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 | |
parent | 3e5066589244d812a218433ab25fe6d6f6e1fe84 (diff) |
added CLDeviceFilters utility api.
-rw-r--r-- | src/com/jogamp/opencl/CLDevice.java | 12 | ||||
-rw-r--r-- | src/com/jogamp/opencl/CLPlatform.java | 105 | ||||
-rw-r--r-- | src/com/jogamp/opencl/util/CLDeviceFilters.java | 90 | ||||
-rw-r--r-- | src/com/jogamp/opencl/util/CLPlatformFilters.java | 21 |
4 files changed, 193 insertions, 35 deletions
diff --git a/src/com/jogamp/opencl/CLDevice.java b/src/com/jogamp/opencl/CLDevice.java index d652d122..1e9a94dd 100644 --- a/src/com/jogamp/opencl/CLDevice.java +++ b/src/com/jogamp/opencl/CLDevice.java @@ -33,6 +33,7 @@ import com.jogamp.common.nio.PointerBuffer; import com.jogamp.common.os.Platform; import java.nio.Buffer; import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Collections; import java.util.EnumSet; @@ -654,6 +655,17 @@ public final class CLDevice extends CLObject { } /** + * Returns {@link ByteOrder#LITTLE_ENDIAN} or {@link ByteOrder#BIG_ENDIAN}. + */ + public ByteOrder getByteOrder() { + if(isLittleEndian()) { + return ByteOrder.LITTLE_ENDIAN; + }else{ + return ByteOrder.BIG_ENDIAN; + } + } + + /** * Returns all device extension names as unmodifiable Set. */ @CLProperty("CL_DEVICE_EXTENSIONS") 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") diff --git a/src/com/jogamp/opencl/util/CLDeviceFilters.java b/src/com/jogamp/opencl/util/CLDeviceFilters.java new file mode 100644 index 00000000..a69b11a1 --- /dev/null +++ b/src/com/jogamp/opencl/util/CLDeviceFilters.java @@ -0,0 +1,90 @@ +/* + * Copyright 2011 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +package com.jogamp.opencl.util; + +import com.jogamp.opencl.CLDevice; +import java.nio.ByteOrder; +import java.util.Arrays; + +/** + * Pre-defined filters. + * @author Michael Bien + * @see com.jogamp.opencl.CLPlatform#listCLDevices(com.jogamp.opencl.util.Filter[]) + * @see com.jogamp.opencl.CLPlatform#getMaxFlopsDevice(com.jogamp.opencl.util.Filter[]) + */ +public class CLDeviceFilters { + + /** + * Accepts all devices of the given type. + */ + public static Filter<CLDevice> type(final CLDevice.Type type) { + return new Filter<CLDevice>() { + public boolean accept(CLDevice item) { + if(type.equals(CLDevice.Type.ALL)) { + return true; + } + return item.getType().equals(type); + } + }; + } + + /** + * Accepts all devices of the given {@link ByteOrder}. + */ + public static Filter<CLDevice> byteOrder(final ByteOrder order) { + return new Filter<CLDevice>() { + public boolean accept(CLDevice item) { + return item.getByteOrder().equals(order); + } + }; + } + + /** + * Accepts all devices which support OpenGL-OpenCL interoparability. + */ + public static Filter<CLDevice> glSharing() { + return new Filter<CLDevice>() { + public boolean accept(CLDevice item) { + return item.isGLMemorySharingSupported(); + } + }; + } + + /** + * Accepts all devices supporting the given extensions. + */ + public static Filter<CLDevice> extension(final String... extensions) { + return new Filter<CLDevice>() { + public boolean accept(CLDevice item) { + return item.getExtensions().containsAll(Arrays.asList(extensions)); + } + }; + } + +} diff --git a/src/com/jogamp/opencl/util/CLPlatformFilters.java b/src/com/jogamp/opencl/util/CLPlatformFilters.java index 3d23a45c..f5a4f55f 100644 --- a/src/com/jogamp/opencl/util/CLPlatformFilters.java +++ b/src/com/jogamp/opencl/util/CLPlatformFilters.java @@ -62,11 +62,28 @@ public class CLPlatformFilters { } }; } + + /** + * Accepts all platforms containing at least one devices of which supports OpenGL-OpenCL interoparability. + */ + public static Filter<CLPlatform> glSharing() { + return new Filter<CLPlatform>() { + public boolean accept(CLPlatform item) { + CLDevice[] devices = item.listCLDevices(); + for (CLDevice device : devices) { + if(device.isGLMemorySharingSupported()) { + return true; + } + } + return false; + } + }; + } /** - * Accepts all platforms containing devices of the given extensions. + * Accepts all platforms supporting the given extensions. */ - public static Filter<CLPlatform> extensions(final String... extensions) { + public static Filter<CLPlatform> extension(final String... extensions) { return new Filter<CLPlatform>() { public boolean accept(CLPlatform item) { return item.getExtensions().containsAll(Arrays.asList(extensions)); |