summaryrefslogtreecommitdiffstats
path: root/src/com/jogamp/opencl
diff options
context:
space:
mode:
authorMichael Bien <[email protected]>2011-03-29 02:45:16 +0200
committerMichael Bien <[email protected]>2011-03-29 02:45:16 +0200
commit612fd3e9e9c157cc28d42791fd04711701def6e3 (patch)
tree45f5ae34d90091945aaa681d2ebb99a3610813a2 /src/com/jogamp/opencl
parent3e5066589244d812a218433ab25fe6d6f6e1fe84 (diff)
added CLDeviceFilters utility api.
Diffstat (limited to 'src/com/jogamp/opencl')
-rw-r--r--src/com/jogamp/opencl/CLDevice.java12
-rw-r--r--src/com/jogamp/opencl/CLPlatform.java105
-rw-r--r--src/com/jogamp/opencl/util/CLDeviceFilters.java90
-rw-r--r--src/com/jogamp/opencl/util/CLPlatformFilters.java21
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));