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); }
/// <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"); }
public extern static OpenCLErrorCode GetDeviceIDs( CLPlatformHandle platform, OpenCLDeviceType device_type, Int32 num_entries, [Out, MarshalAs(UnmanagedType.LPArray)] CLDeviceHandle[] devices, out Int32 num_devices);
public extern static CLContextHandle CreateContextFromType( [MarshalAs(UnmanagedType.LPArray)] IntPtr[] properties, OpenCLDeviceType device_type, OpenCLContextNotifier pfn_notify, IntPtr user_data, out OpenCLErrorCode errcode_ret);