Пример #1
0
        /// <summary>
        /// Provides access to <see cref="UnitGetLedState_Interop"/>
        /// without using raw pointers.
        /// </summary>
        public unsafe NvmlReturn UnitGetLedState(IntPtr unit, out NvmlLedState ledState)
        {
            NvmlReturn result = UnitGetLedState_Interop(unit, out var interopResult);

            if (result == NvmlReturn.NVML_SUCCESS)
            {
                var causeSpan = new Span <byte>(
                    interopResult.Cause,
                    NvmlLedState_Interop.NVML_MAX_CAUSE);
                var strlen = causeSpan.IndexOf <byte>(0);
                var cause  = Encoding.UTF8.GetString(interopResult.Cause, strlen);

                ledState =
                    new NvmlLedState()
                {
                    Cause = cause,
                    Color = interopResult.Color,
                };
            }
            else
            {
                ledState = default;
            }

            return(result);
        }
Пример #2
0
        /// <summary>
        /// Helper method to read an array of values from the NVML Interop API.
        /// </summary>
        /// <param name="interopFunc">The interop function.</param>
        /// <param name="nvmlArray">Filled in with the result array.</param>
        /// <returns>The interop status code.</returns>
        internal unsafe static NvmlReturn GetNvmlArray <T>(
            GetNvmlArrayInterop <T> interopFunc,
            out T[] nvmlArray)
            where T : unmanaged
        {
            // Query the length of data available.
            // If the result is success, that means an empty array.
            uint       length = 0;
            NvmlReturn result = interopFunc(ref length, null);

            if (result == NvmlReturn.NVML_SUCCESS)
            {
                nvmlArray = Array.Empty <T>();
                return(result);
            }
            else if (result == NvmlReturn.NVML_ERROR_INSUFFICIENT_SIZE)
            {
                // Allocate the correct size, and call the interop again.
                T[] buffer = new T[length];
                fixed(T *ptr = buffer)
                {
                    result    = interopFunc(ref length, ptr);
                    nvmlArray = result == NvmlReturn.NVML_SUCCESS
                        ? buffer
                        : default;
                    return(result);
                }
            }
            else
            {
                nvmlArray = default;
                return(result);
            }
        }
Пример #3
0
 public static void ThrowIfFailed(NvmlReturn errorCode)
 {
     if (errorCode != NvmlReturn.NVML_SUCCESS)
     {
         throw new NvmlException(errorCode);
     }
 }
Пример #4
0
        /// <summary>
        /// Provides access to <see cref="UnitGetPsuInfo_Interop"/>
        /// without using raw pointers.
        /// </summary>
        public unsafe NvmlReturn UnitGetPsuInfo(IntPtr unit, out NvmlPSUInfo psuInfo)
        {
            NvmlReturn result = UnitGetPsuInfo_Interop(unit, out var interopResult);

            if (result == NvmlReturn.NVML_SUCCESS)
            {
                var stateSpan = new Span <byte>(
                    interopResult.State,
                    NvmlPSUInfo_Interop.NVML_MAX_STATE);
                var strlen = stateSpan.IndexOf <byte>(0);
                var state  = Encoding.UTF8.GetString(interopResult.State, strlen);

                psuInfo =
                    new NvmlPSUInfo()
                {
                    Current = interopResult.Current,
                    Power   = interopResult.Power,
                    State   = state,
                    Voltage = interopResult.Voltage,
                };
            }
            else
            {
                psuInfo = default;
            }

            return(result);
        }
Пример #5
0
        public static NvmlReturn GetDriverVersionString(out string version)
        {
            StringBuilder builder = new StringBuilder(SYSTEM_DRIVER_VERSION_BUFFER_SIZE);
            NvmlReturn    result  = NvmlSystemGetDriverVersion(builder, SYSTEM_DRIVER_VERSION_BUFFER_SIZE);

            version = builder.ToString();
            return(result);
        }
Пример #6
0
        public static NvmlReturn GetDeviceVbiosVersionString(NvmlDevice device, out string version)
        {
            StringBuilder builder = new StringBuilder(DEVICE_VBIOS_VERSION_BUFFER_SIZE);
            NvmlReturn    result  = NvmlDeviceGetVbiosVersion(device, builder, DEVICE_VBIOS_VERSION_BUFFER_SIZE);

            version = builder.ToString();
            return(result);
        }
Пример #7
0
        public static NvmlReturn GetDeviceUUID(NvmlDevice device, out string uuid)
        {
            StringBuilder builder = new StringBuilder(DEVICE_UUID_BUFFER_SIZE);
            NvmlReturn    result  = NvmlDeviceGetUUID(device, builder, DEVICE_UUID_BUFFER_SIZE);

            uuid = builder.ToString();
            return(result);
        }
Пример #8
0
        public static NvmlReturn GetDeviceName(NvmlDevice device, out string name)
        {
            StringBuilder builder = new StringBuilder(DEVICE_NAME_BUFFER_SIZE);
            NvmlReturn    result  = NvmlDeviceGetName(device, builder, DEVICE_NAME_BUFFER_SIZE);

            name = builder.ToString();
            return(result);
        }
Пример #9
0
        /// <summary>
        /// Provides access to <see cref="SystemGetCudaDriverVersion_v2_Interop"/>
        /// without using raw pointers.
        /// </summary>
        public NvmlReturn SystemGetCudaDriverVersion_v2(
            out CudaDriverVersion cudaDriverVersion)
        {
            NvmlReturn result = SystemGetCudaDriverVersion_v2_Interop(out int version);

            cudaDriverVersion = result == NvmlReturn.NVML_SUCCESS
                ? CudaDriverVersion.FromValue(version)
                : default;
            return(result);
        }
Пример #10
0
        /// <summary>
        /// Provides access to <see cref="UnitGetUnitInfo_Interop"/>
        /// without using raw pointers.
        /// </summary>
        public unsafe NvmlReturn UnitGetUnitInfo(IntPtr unit, out NvmlUnitInfo info)
        {
            NvmlReturn result = UnitGetUnitInfo_Interop(unit, out var interopResult);

            if (result == NvmlReturn.NVML_SUCCESS)
            {
                var strSpan = new Span <byte>(
                    interopResult.FirmwareVersion,
                    NvmlUnitInfo_Interop.NVML_MAX_STRLEN);
                var    strlen          = strSpan.IndexOf <byte>(0);
                string firmwareVersion = Encoding.UTF8.GetString(
                    interopResult.FirmwareVersion,
                    strlen);

                strSpan = new Span <byte>(
                    interopResult.Id,
                    NvmlUnitInfo_Interop.NVML_MAX_STRLEN);
                strlen = strSpan.IndexOf <byte>(0);
                string id = Encoding.UTF8.GetString(
                    interopResult.Id,
                    strlen);

                strSpan = new Span <byte>(
                    interopResult.Name,
                    NvmlUnitInfo_Interop.NVML_MAX_STRLEN);
                strlen = strSpan.IndexOf <byte>(0);
                string name = Encoding.UTF8.GetString(
                    interopResult.Name,
                    strlen);

                strSpan = new Span <byte>(
                    interopResult.Serial,
                    NvmlUnitInfo_Interop.NVML_MAX_STRLEN);
                strlen = strSpan.IndexOf <byte>(0);
                string serial = Encoding.UTF8.GetString(
                    interopResult.Serial,
                    strlen);

                info =
                    new NvmlUnitInfo()
                {
                    FirmwareVersion = firmwareVersion,
                    Id     = id,
                    Name   = name,
                    Serial = serial,
                };
            }
            else
            {
                info = default;
            }

            return(result);
        }
Пример #11
0
        public static uint NvmlDeviceGetCountV2()
        {
            uint       count = 0;
            NvmlReturn res   = Api.NvmlDeviceGetCount_v2(out count);

            if (NvmlReturn.NVML_SUCCESS != res)
            {
                throw new SystemException(res.ToString());
            }

            return(count);
        }
Пример #12
0
        public static NvmlPciInfo NvmlDeviceGetPciInfoV3(IntPtr device)
        {
            NvmlPciInfo data = new NvmlPciInfo();
            NvmlReturn  res  = Api.NvmlDeviceGetPciInfo_v3(device, out data);

            if (NvmlReturn.NVML_SUCCESS != res)
            {
                throw new SystemException(res.ToString());
            }

            return(data);
        }
Пример #13
0
        public static string NvmlDeviceGetBoardPartNumber(IntPtr device, uint length)
        {
            byte[]     partNumber = new byte[length];
            NvmlReturn res        = Api.NvmlDeviceGetBoardPartNumber(device, partNumber, length);

            if (NvmlReturn.NVML_SUCCESS != res)
            {
                throw new SystemException(res.ToString());
            }

            return(Encoding.Default.GetString(partNumber).Replace("\0", ""));
        }
Пример #14
0
        /// <summary>
        /// Helper method to read an array of values from the NVML Interop API.
        /// </summary>
        /// <param name="interopFunc">The interop function.</param>
        /// <param name="nvmlArray1">Filled in with the result array.</param>
        /// <param name="nvmlArray2">Filled in with the result array.</param>
        /// <returns>The interop status code.</returns>
        internal unsafe static NvmlReturn GetNvmlArray <T1, T2>(
            GetNvmlArrayInterop <T1, T2> interopFunc,
            out T1[] nvmlArray1,
            out T2[] nvmlArray2)
            where T1 : unmanaged
            where T2 : unmanaged
        {
            // Query the length of data available.
            // If the result is success, that means an empty array.
            uint       length = 0;
            NvmlReturn result = interopFunc(ref length, null, null);

            if (result == NvmlReturn.NVML_SUCCESS)
            {
                nvmlArray1 = Array.Empty <T1>();
                nvmlArray2 = Array.Empty <T2>();
                return(result);
            }
            else if (result == NvmlReturn.NVML_ERROR_INSUFFICIENT_SIZE)
            {
                // Allocate the correct size, and call the interop again.
                T1[] buffer1 = new T1[length];
                T2[] buffer2 = new T2[length];
                fixed(T1 *ptr1 = buffer1)
                fixed(T2 * ptr2 = buffer2)
                {
                    result = interopFunc(ref length, ptr1, ptr2);
                    if (result == NvmlReturn.NVML_SUCCESS)
                    {
                        nvmlArray1 = buffer1;
                        nvmlArray2 = buffer2;
                    }
                    else
                    {
                        nvmlArray1 = default;
                        nvmlArray2 = default;
                    }
                    return(result);
                }
            }
            else
            {
                nvmlArray1 = default;
                nvmlArray2 = default;
                return(result);
            }
        }
Пример #15
0
        /// <summary>
        /// Helper method to fill a fixed sized array of values from the NVML Interop API.
        /// </summary>
        /// <param name="interopFunc">The interop function.</param>
        /// <param name="length">The desired length.</param>
        /// <param name="nvmlArray">Filled in with the result array.</param>
        /// <returns>The interop status code.</returns>
        internal unsafe static NvmlReturn FillNvmlArray <T>(
            FillNvmlArrayInterop <T> interopFunc,
            uint length,
            out T[] nvmlArray)
            where T : unmanaged
        {
            // Allocate enough space for the requested length.
            T[] buffer = new T[length];

            fixed(T *ptr = buffer)
            {
                NvmlReturn result = interopFunc(length, ptr);

                nvmlArray = (result == NvmlReturn.NVML_SUCCESS) ? buffer : default;
                return(result);
            }
        }
Пример #16
0
        /// <summary>
        /// Provides access to <see cref="DeviceGetSamples_Interop"/>
        /// without using raw pointers.
        /// </summary>
        public unsafe NvmlReturn DeviceGetSamples(
            IntPtr device,
            NvmlSamplingType type,
            ulong lastSeenTimeStamp,
            out NvmlValueType sampleValType,
            uint sampleCount,
            out NvmlSample[] samples)
        {
            // Allocate enough space for sampleCount.
            uint length = sampleCount;

            NvmlSample[] buffer = new NvmlSample[length];

            fixed(NvmlSample *ptr = buffer)
            {
                NvmlReturn result = DeviceGetSamples_Interop(
                    device,
                    type,
                    lastSeenTimeStamp,
                    out sampleValType,
                    ref length,
                    ptr);

                if (result == NvmlReturn.NVML_SUCCESS)
                {
                    // Adjust the return buffer to the actual length.
                    if (length < sampleCount)
                    {
                        Array.Resize(ref buffer, (int)length);
                    }
                    samples = buffer;
                }
                else
                {
                    samples = default;
                }

                return(result);
            }
        }
Пример #17
0
        /// <summary>
        /// Provides access to <see cref="SystemGetHicVersion_Interop"/>
        /// without using raw pointers.
        /// </summary>
        public unsafe NvmlReturn SystemGetHicVersion(out NvmlHwbcEntry[] hwbcEntries)
        {
            NvmlReturn Interop(ref uint len, NvmlHwbcEntry_Interop *ptr) =>
            SystemGetHicVersion_Interop(ref len, ptr);

            NvmlReturn result = GetNvmlArray <NvmlHwbcEntry_Interop>(
                Interop,
                out var interopResult);

            if (result == NvmlReturn.NVML_SUCCESS)
            {
                hwbcEntries = new NvmlHwbcEntry[interopResult.Length];
                for (int i = 0; i < interopResult.Length; i++)
                {
                    var interopItem         = interopResult[i];
                    var firmwareVersionSpan = new Span <byte>(
                        interopItem.FirmwareVersion,
                        NvmlHwbcEntry_Interop.NVML_MAX_FIRMWAREVERSION);
                    var strlen          = firmwareVersionSpan.IndexOf <byte>(0);
                    var firmwareVersion = Encoding.UTF8.GetString(
                        interopItem.FirmwareVersion,
                        strlen);
                    hwbcEntries[i] =
                        new NvmlHwbcEntry
                    {
                        HwbcId          = interopResult[i].HwbcId,
                        FirmwareVersion = firmwareVersion,
                    };
                }
            }
            else
            {
                hwbcEntries = default;
            }

            return(result);
        }
Пример #18
0
        public NvidiaGroup(ISettings settings)
        {
            if (NVML.IsAvailable)
            {
                report.AppendLine("NVML");
                report.AppendLine();

                if (NVML.GetNvmlVersionString(out string version) == NvmlReturn.SUCCESS)
                {
                    report.Append("Version: ");
                    report.AppendLine(version);
                }

                NvmlReturn result = NVML.NvmlDeviceGetCount(out uint count);
                if (result != NvmlReturn.SUCCESS)
                {
                    report.AppendLine("Error: " + result);
                    report.AppendLine();
                    return;
                }

                report.Append("Number of GPUs: ");
                report.AppendLine(count.ToString(CultureInfo.InvariantCulture));

                for (uint i = 0; i < count; i++)
                {
                    hardware.Add(new NvidiaGPU(i, settings));
                }

                report.AppendLine();
            }
            else if (NVAPI.IsAvailable)
            {
                report.AppendLine("NVAPI");
                report.AppendLine();

                string version;
                if (NVAPI.NvAPI_GetInterfaceVersionString(out version) == NvStatus.OK)
                {
                    report.Append("Version: ");
                    report.AppendLine(version);
                }

                NvPhysicalGpuHandle[] handles =
                    new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS];
                int count;
                if (NVAPI.NvAPI_EnumPhysicalGPUs == null)
                {
                    report.AppendLine("Error: NvAPI_EnumPhysicalGPUs not available");
                    report.AppendLine();
                    return;
                }
                else
                {
                    NvStatus status = NVAPI.NvAPI_EnumPhysicalGPUs(handles, out count);
                    if (status != NvStatus.OK)
                    {
                        report.AppendLine("Status: " + status);
                        report.AppendLine();
                        return;
                    }
                }

                IDictionary <NvPhysicalGpuHandle, NvDisplayHandle> displayHandles =
                    new Dictionary <NvPhysicalGpuHandle, NvDisplayHandle>();

                if (NVAPI.NvAPI_EnumNvidiaDisplayHandle != null &&
                    NVAPI.NvAPI_GetPhysicalGPUsFromDisplay != null)
                {
                    NvStatus status = NvStatus.OK;
                    int      i      = 0;
                    while (status == NvStatus.OK)
                    {
                        NvDisplayHandle displayHandle = new NvDisplayHandle();
                        status = NVAPI.NvAPI_EnumNvidiaDisplayHandle(i, ref displayHandle);
                        i++;

                        if (status == NvStatus.OK)
                        {
                            NvPhysicalGpuHandle[] handlesFromDisplay =
                                new NvPhysicalGpuHandle[NVAPI.MAX_PHYSICAL_GPUS];
                            uint countFromDisplay;
                            if (NVAPI.NvAPI_GetPhysicalGPUsFromDisplay(displayHandle,
                                                                       handlesFromDisplay, out countFromDisplay) == NvStatus.OK)
                            {
                                for (int j = 0; j < countFromDisplay; j++)
                                {
                                    if (!displayHandles.ContainsKey(handlesFromDisplay[j]))
                                    {
                                        displayHandles.Add(handlesFromDisplay[j], displayHandle);
                                    }
                                }
                            }
                        }
                    }
                }

                report.Append("Number of GPUs: ");
                report.AppendLine(count.ToString(CultureInfo.InvariantCulture));

                for (int i = 0; i < count; i++)
                {
                    NvDisplayHandle displayHandle;
                    displayHandles.TryGetValue(handles[i], out displayHandle);
                    hardware.Add(new NvidiaGPULegacy(i, handles[i], displayHandle, settings));
                }

                report.AppendLine();
            }
        }
Пример #19
0
 /// <summary>
 /// Constructs a new NVML exception.
 /// </summary>
 /// <param name="errorCode">The NVML runtime error.</param>
 public NvmlException(NvmlReturn errorCode)
     : base()
 {
     Error = errorCode;
 }