public OpenCLDevice(Context context, OpenCLDeviceType deviceType, int numCUsToReserve, float fractionCUsForIRUpdate,
                            bool requiresTAN)
        {
            var deviceSettings = new OpenCLDeviceSettings {
            };

            deviceSettings.type                   = deviceType;
            deviceSettings.numCUsToReserve        = numCUsToReserve;
            deviceSettings.fractionCUsForIRUpdate = fractionCUsForIRUpdate;
            deviceSettings.requiresTAN            = requiresTAN ? Bool.True : Bool.False;

            var deviceList = IntPtr.Zero;
            var status     = API.iplOpenCLDeviceListCreate(context.Get(), ref deviceSettings, out deviceList);

            if (status != Error.Success)
            {
                throw new Exception(string.Format("Unable to enumerate OpenCL devices. [{0}]", status));
            }

            var numDevices = API.iplOpenCLDeviceListGetNumDevices(deviceList);

            if (numDevices <= 0)
            {
                API.iplOpenCLDeviceListRelease(ref deviceList);

                // If we explicitly requested a device that supports TAN, or if we didn't ask for CU
                // reservation, but still didn't find any devices, stop.
                if (requiresTAN || numCUsToReserve == 0)
                {
                    throw new Exception(string.Format("No OpenCL devices found."));
                }

                Debug.LogWarning("No OpenCL devices found that match the provided parameters, attempting to " +
                                 "initialize without CU reservation.");

                deviceSettings.numCUsToReserve        = 0;
                deviceSettings.fractionCUsForIRUpdate = 0.0f;
                status = API.iplOpenCLDeviceListCreate(context.Get(), ref deviceSettings, out deviceList);
                if (status != Error.Success)
                {
                    throw new Exception(string.Format("Unable to enumerate OpenCL devices. [{0}]", status));
                }

                numDevices = API.iplOpenCLDeviceListGetNumDevices(deviceList);
                if (numDevices <= 0)
                {
                    throw new Exception(string.Format("No OpenCL devices found."));
                }
            }

            status = API.iplOpenCLDeviceCreate(context.Get(), deviceList, 0, out mOpenCLDevice);
            if (status != Error.Success)
            {
                API.iplOpenCLDeviceListRelease(ref deviceList);
                throw new Exception(string.Format("Unable to create OpenCL device. [{0}]", status));
            }

            API.iplOpenCLDeviceListRelease(ref deviceList);
        }