/// <summary> /// Gets a read-only collection of available devices on the platform. /// </summary> /// <returns> A read-only collection of the available devices on the platform. </returns> /// <remarks> This method resets the <c>ComputePlatform.Devices</c>. This is useful if one or more of them become unavailable (<c>ComputeDevice.Available</c> is <c>false</c>) after a device and command queues that use the device have been created and commands have been queued to them. Further calls will trigger an <c>OutOfResourcesComputeException</c> until this method is executed. You will also need to recreate any <see cref="ComputeResource"/> that was created on the no longer available device. </remarks> public ReadOnlyCollection <IComputeDevice> QueryDevices() { var error = CL10.GetDeviceIDs(Handle, ComputeDeviceTypes.All, 0, null, out int handlesLength); ComputeException.ThrowOnError(error); var handles = new CLDeviceHandle[handlesLength]; error = CL10.GetDeviceIDs(Handle, ComputeDeviceTypes.All, handlesLength, handles, out handlesLength); ComputeException.ThrowOnError(error); var devices = new ComputeDevice[handlesLength]; for (int i = 0; i < handlesLength; i++) { devices[i] = new ComputeDevice(this, handles[i]); } Devices = new ReadOnlyCollection <IComputeDevice>(devices); return(Devices); }
/// <summary> /// Gets a read-only collection of available <see cref="OpenCLDevice"/>s on the <see cref="OpenCLPlatform"/>. /// </summary> /// <returns> A read-only collection of the available <see cref="OpenCLDevice"/>s on the <see cref="OpenCLPlatform"/>. </returns> /// <remarks> This method resets the <c>OpenCLPlatform.Devices</c>. This is useful if one or more of them become unavailable (<c>OpenCLDevice.Available</c> is <c>false</c>) after a <see cref="OpenCLContext"/> and <see cref="OpenCLCommandQueue"/>s that use the <see cref="OpenCLDevice"/> have been created and commands have been queued to them. Further calls will trigger an <c>OutOfResourcesOpenCLException</c> until this method is executed. You will also need to recreate any <see cref="OpenCLResource"/> that was created on the no longer available <see cref="OpenCLDevice"/>. </remarks> public ReadOnlyCollection <OpenCLDevice> QueryDevices() { int handlesLength = 0; OpenCLErrorCode error = CL10.GetDeviceIDs(Handle, OpenCLDeviceType.All, 0, null, out handlesLength); OpenCLException.ThrowOnError(error); CLDeviceHandle[] handles = new CLDeviceHandle[handlesLength]; error = CL10.GetDeviceIDs(Handle, OpenCLDeviceType.All, handlesLength, handles, out handlesLength); OpenCLException.ThrowOnError(error); OpenCLDevice[] devices = new OpenCLDevice[handlesLength]; for (int i = 0; i < handlesLength; i++) { devices[i] = new OpenCLDevice(this, handles[i]); } this.devices = new ReadOnlyCollection <OpenCLDevice>(devices); return(this.devices); }