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);
        }
Esempio n. 2
0
        /// <summary>
        /// Creates a new <see cref="OpenCLContext"/> on all the <see cref="OpenCLDevice"/>s that match the specified <see cref="OpenCLDeviceTypes"/>.
        /// </summary>
        /// <param name="deviceType"> A bit-field that identifies the type of <see cref="OpenCLDevice"/> to associate with the <see cref="OpenCLContext"/>. </param>
        /// <param name="properties"> A <see cref="OpenCLContextPropertyList"/> of the <see cref="OpenCLContext"/>. </param>
        /// <param name="notify"> A delegate instance that refers to a notification routine. This routine is a callback function that will be used by the OpenCL implementation to report information on errors that occur in the <see cref="OpenCLContext"/>. The callback function may be called asynchronously by the OpenCL implementation. It is the application's responsibility to ensure that the callback function is thread-safe and that the delegate instance doesn't get collected by the Garbage Collector until <see cref="OpenCLContext"/> is disposed. If <paramref name="notify"/> is <c>null</c>, no callback function is registered. </param>
        /// <param name="userDataPtr"> Optional user data that will be passed to <paramref name="notify"/>. </param>
        public OpenCLContext(OpenCLDeviceType deviceType, OpenCLContextPropertyList properties, OpenCLContextNotifier notify, IntPtr userDataPtr)
        {
            IntPtr[] propertyArray = (properties != null) ? properties.ToIntPtrArray() : null;
            callback = notify;

            OpenCLErrorCode error = OpenCLErrorCode.Success;

            Handle = CL10.CreateContextFromType(propertyArray, deviceType, notify, userDataPtr, out error);
            OpenCLException.ThrowOnError(error);

            SetID(Handle.Value);

            this.properties = properties;
            OpenCLContextProperty platformProperty = properties.GetByName(OpenCLContextProperties.Platform);

            this.platform = OpenCLPlatform.GetByHandle(platformProperty.Value);
            this.devices  = GetDevices();

            //Trace.WriteLine("Create " + this + " in Thread(" + Thread.CurrentThread.ManagedThreadId + ").", "Information");
        }
Esempio n. 3
0
 public extern static OpenCLErrorCode GetDeviceIDs(
     CLPlatformHandle platform,
     OpenCLDeviceType device_type,
     Int32 num_entries,
     [Out, MarshalAs(UnmanagedType.LPArray)] CLDeviceHandle[] devices,
     out Int32 num_devices);
Esempio n. 4
0
 public extern static CLContextHandle CreateContextFromType(
     [MarshalAs(UnmanagedType.LPArray)] IntPtr[] properties,
     OpenCLDeviceType device_type,
     OpenCLContextNotifier pfn_notify,
     IntPtr user_data,
     out OpenCLErrorCode errcode_ret);
Esempio n. 5
0
        /// <summary>
        /// Creates a new <see cref="OpenCLContext"/> on all the <see cref="OpenCLDevice"/>s that match the specified <see cref="OpenCLDeviceTypes"/>.
        /// </summary>
        /// <param name="deviceType"> A bit-field that identifies the type of <see cref="OpenCLDevice"/> to associate with the <see cref="OpenCLContext"/>. </param>
        /// <param name="properties"> A <see cref="OpenCLContextPropertyList"/> of the <see cref="OpenCLContext"/>. </param>
        /// <param name="notify"> A delegate instance that refers to a notification routine. This routine is a callback function that will be used by the OpenCL implementation to report information on errors that occur in the <see cref="OpenCLContext"/>. The callback function may be called asynchronously by the OpenCL implementation. It is the application's responsibility to ensure that the callback function is thread-safe and that the delegate instance doesn't get collected by the Garbage Collector until <see cref="OpenCLContext"/> is disposed. If <paramref name="notify"/> is <c>null</c>, no callback function is registered. </param>
        /// <param name="userDataPtr"> Optional user data that will be passed to <paramref name="notify"/>. </param>
        public OpenCLContext(OpenCLDeviceType deviceType, OpenCLContextPropertyList properties, OpenCLContextNotifier notify, IntPtr userDataPtr)
        {
            IntPtr[] propertyArray = (properties != null) ? properties.ToIntPtrArray() : null;
            callback = notify;

            OpenCLErrorCode error = OpenCLErrorCode.Success;
            Handle = CL10.CreateContextFromType(propertyArray, deviceType, notify, userDataPtr, out error);
            OpenCLException.ThrowOnError(error);

            SetID(Handle.Value);

            this.properties = properties;
            OpenCLContextProperty platformProperty = properties.GetByName(OpenCLContextProperties.Platform);
            this.platform = OpenCLPlatform.GetByHandle(platformProperty.Value);
            this.devices = GetDevices();

            //Trace.WriteLine("Create " + this + " in Thread(" + Thread.CurrentThread.ManagedThreadId + ").", "Information");
        }
Esempio n. 6
0
 public extern static OpenCLErrorCode GetDeviceIDs(
     CLPlatformHandle platform,
     OpenCLDeviceType device_type,
     Int32 num_entries,
     [Out, MarshalAs(UnmanagedType.LPArray)] CLDeviceHandle[] devices,
     out Int32 num_devices);
Esempio n. 7
0
 public extern static CLContextHandle CreateContextFromType(
     [MarshalAs(UnmanagedType.LPArray)] IntPtr[] properties,
     OpenCLDeviceType device_type,
     OpenCLContextNotifier pfn_notify,
     IntPtr user_data,
     out OpenCLErrorCode errcode_ret);