summaryrefslogtreecommitdiffstats
path: root/src/com/jogamp/opencl/CLSubDevice.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/jogamp/opencl/CLSubDevice.java')
-rw-r--r--src/com/jogamp/opencl/CLSubDevice.java170
1 files changed, 170 insertions, 0 deletions
diff --git a/src/com/jogamp/opencl/CLSubDevice.java b/src/com/jogamp/opencl/CLSubDevice.java
new file mode 100644
index 00000000..68cbe9dc
--- /dev/null
+++ b/src/com/jogamp/opencl/CLSubDevice.java
@@ -0,0 +1,170 @@
+/*
+ * Created on Wednesday, July 13 2011 00:50
+ */
+package com.jogamp.opencl;
+
+import com.jogamp.opencl.llb.CL;
+
+import static com.jogamp.opencl.llb.CL.*;
+
+/**
+ * A subdevice created through device fission.
+ * A subdevice can be used like any other device but must be released if no longer needed.
+ * <p>
+ * possible usecases for device fission:
+ * <ul>
+ * <li> To reserve part of the device for use for high priority / latency-sensitive tasks </li>
+ * <li> To more directly control the assignment of work to individual compute units </li>
+ * <li> To subdivide compute devices along some shared hardware feature like a cache </li>
+ * </ul>
+ * </p>
+ * @see CLDevice#createSubDevicesEqually(int)
+ * @see CLDevice#createSubDevicesByCount(int[])
+ * @see CLDevice#createSubDeviceByIndex(int[])
+ * @see CLDevice#createSubDevicesByDomain(com.jogamp.opencl.CLSubDevice.AffinityDomain)
+ * @author Michael Bien
+ */
+public class CLSubDevice extends CLDevice implements CLResource {
+
+ private volatile boolean released;
+
+ private final CLDevice parent;
+
+ private CLSubDevice(CLDevice parent, CLContext context, long id) {
+ super(context, id);
+ this.parent = parent;
+ }
+
+ private CLSubDevice(CLDevice parent, CLPlatform platform, long id) {
+ super(platform, id);
+ this.parent = parent;
+ }
+
+ static CLSubDevice createSubDevice(CLDevice device, long id) {
+ if(device.context == null) {
+ return new CLSubDevice(device, device.getPlatform(), id);
+ }else{
+ return new CLSubDevice(device, device.getContext(), id);
+ }
+ }
+
+ /**
+ * Returns the parent device which may be a CLDevice or another CLSubDevice.
+ */
+ public CLDevice getParent() {
+ return parent;
+ }
+
+ @Override
+ public void release() {
+ if(released) {
+ throw new RuntimeException("already released");
+ }
+ released = true;
+ CL cl = CLPlatform.getLowLevelCLInterface();
+ int ret = cl.clReleaseDeviceEXT(ID);
+ CLException.checkForError(ret, "release failed");
+ }
+
+ @Override
+ public boolean isReleased() {
+ return released;
+ }
+
+ @Override
+ public boolean isSubDevice() {
+ return true;
+ }
+
+
+ /**
+ * Sub device affinity domains.
+ * @see CLDevice#createSubDevicesByDomain(com.jogamp.opencl.CLSubDevice.AffinityDomain)
+ */
+ public enum AffinityDomain {
+
+ L1_CACHE(CL_AFFINITY_DOMAIN_L1_CACHE_EXT),
+
+ L2_CACHE(CL_AFFINITY_DOMAIN_L2_CACHE_EXT),
+
+ L3_CACHE(CL_AFFINITY_DOMAIN_L3_CACHE_EXT),
+
+ L4_CACHE(CL_AFFINITY_DOMAIN_L4_CACHE_EXT),
+
+ NUMA(CL_AFFINITY_DOMAIN_NUMA_EXT),
+
+ NEXT_FISSIONABLE(CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT);
+
+ /**
+ * Value of wrapped OpenCL value.
+ */
+ public final int TYPE;
+
+ private AffinityDomain(int type) {
+ this.TYPE = type;
+ }
+
+ /**
+ * Returns the matching AffinityDomain for the given cl flag.
+ */
+ public static AffinityDomain valueOf(int domain) {
+ AffinityDomain[] values = AffinityDomain.values();
+ for (AffinityDomain value : values) {
+ if(value.TYPE == domain)
+ return value;
+ }
+ return null;
+ }
+
+ }
+
+ /**
+ * Sub device partition styles.
+ * @see CLDevice#getPartitionTypes()
+ */
+ public enum Partition {
+
+ /**
+ * @see CLDevice#createSubDevicesEqually(int)
+ */
+ EQUALLY(CL_DEVICE_PARTITION_EQUALLY_EXT),
+
+ /**
+ * @see CLDevice#createSubDevicesByCount(int[])
+ */
+ COUNTS(CL_DEVICE_PARTITION_BY_COUNTS_EXT),
+
+ /**
+ * @see CLDevice#createSubDeviceByIndex(int[])
+ */
+ NAMES(CL_DEVICE_PARTITION_BY_NAMES_EXT),
+
+ /**
+ * @see CLDevice#createSubDevicesByDomain(com.jogamp.opencl.CLSubDevice.AffinityDomain)
+ */
+ DOMAIN(CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT);
+
+ /**
+ * Value of wrapped OpenCL value.
+ */
+ public final int FLAG;
+
+ private Partition(int type) {
+ this.FLAG = type;
+ }
+
+ /**
+ * Returns the matching AffinityDomain for the given cl flag.
+ */
+ public static Partition valueOf(int domain) {
+ Partition[] values = Partition.values();
+ for (Partition value : values) {
+ if(value.FLAG == domain)
+ return value;
+ }
+ return null;
+ }
+
+ }
+
+}