Пример #1
0
        public float?GetSensorValue(int deviceIndex, SensorType sensorType)
        {
            int overdriveVersion = overdriveVersionList[deviceIndex];

            if (overdriveVersion >= 8)
            {
                int sensorIndex = (int)PMLogSensorMap[(int)sensorType];
                if (ADL2_New_QueryPMLogData_Get(context, adapterInfoList[deviceIndex].AdapterIndex, out var data) < 0 ||
                    sensorIndex >= data.Sensors.Length ||
                    !data.Sensors[sensorIndex].Supported)
                {
                    return(null);
                }
                return(data.Sensors[sensorIndex].Value);
            }

            switch (sensorType)
            {
            case SensorType.GFX_LOAD:
                ADLPMActivity ADLPMact = new ADLPMActivity();
                if (overdriveVersion >= 5 && ADL_Overdrive5_CurrentActivity_Get(deviceIndex, ref ADLPMact) == 0)
                {
                    return(ADLPMact.ActivityPercent / 100.0f);
                }
                break;

            case SensorType.GFX_TEMPERATURE:
                if (overdriveVersion >= 7 && ADL2_OverdriveN_Temperature_Get(context, deviceIndex, PMLogSensorMap[(int)sensorType], out int temperature) == 0)
                {
                    return(temperature * 0.001f);
                }
                ADLTemperature ADLTemp = new ADLTemperature();
                if (ADL_Overdrive5_Temperature_Get(deviceIndex, 0, ref ADLTemp) == 0)
                {
                    return(ADLTemp.Temperature * 0.001f);
                }
                break;

            case SensorType.GFX_POWER:
                if (overdriveVersion >= 6 && ADL2_Overdrive6_CurrentPower_Get(context, deviceIndex, ODNSensorMap[(int)sensorType], out int power) == 0)
                {
                    return(power * (1.0f / 0xff));
                }
                break;
            }

            return(null);
        }
Пример #2
0
        };                                                                                     // Keep everything until the miner quits.

        public static bool InitializeADL(OpenCLDevice[] mDevices)
        {
            var ADLRet           = -1;
            var NumberOfAdapters = 0;

            if (null != ADL.ADL_Main_Control_Create)
            {
                ADLRet = ADL.ADL_Main_Control_Create(ADL.ADL_Main_Memory_Alloc, 1);
            }
            if (ADL.ADL_SUCCESS == ADLRet)
            {
                MainForm.Logger("Successfully initialized AMD Display Library.");
                if (null != ADL.ADL_Adapter_NumberOfAdapters_Get)
                {
                    ADL.ADL_Adapter_NumberOfAdapters_Get(ref NumberOfAdapters);
                }
                MainForm.Logger("Number of ADL Adapters: " + NumberOfAdapters.ToString());

                if (0 < NumberOfAdapters)
                {
                    ADLAdapterInfoArray OSAdapterInfoData;
                    OSAdapterInfoData = new ADLAdapterInfoArray();

                    if (null == ADL.ADL_Adapter_AdapterInfo_Get)
                    {
                        MainForm.Logger("ADL.ADL_Adapter_AdapterInfo_Get() is not available.");
                    }
                    else
                    {
                        var AdapterBuffer = IntPtr.Zero;
                        var size          = Marshal.SizeOf(OSAdapterInfoData);
                        AdapterBuffer = Marshal.AllocCoTaskMem((int)size);
                        Marshal.StructureToPtr(OSAdapterInfoData, AdapterBuffer, false);

                        ADLRet = ADL.ADL_Adapter_AdapterInfo_Get(AdapterBuffer, size);
                        if (ADL.ADL_SUCCESS == ADLRet)
                        {
                            OSAdapterInfoData = (ADLAdapterInfoArray)Marshal.PtrToStructure(AdapterBuffer, OSAdapterInfoData.GetType());
                            bool adrenalineWorkaroundRequired = false;
                            foreach (var device in mDevices)
                            {
                                var openclDevice = device.GetComputeDevice();
                                if (device.GetVendor() == "AMD" && openclDevice.PciBusIdAMD <= 0)
                                {
                                    adrenalineWorkaroundRequired = true;
                                }
                            }
                            if (adrenalineWorkaroundRequired)
                            {
                                // workaround for Adrenalin drivers as PciBusIdAMD does not work properly.
                                MainForm.Logger("Manually matching OpenCL devices with ADL devices...");
                                List <int> taken = new List <int> {
                                };
                                foreach (var device in mDevices)
                                {
                                    var openclDevice = device.GetComputeDevice();
                                    if (device.GetVendor() == "AMD")
                                    {
                                        string boardName    = (new System.Text.RegularExpressions.Regex("[^a-zA-Z0-9]+$")).Replace(System.Text.Encoding.ASCII.GetString(openclDevice.BoardNameAMD), ""); // Drop '\0'
                                        int    boardCounter = 0;
                                        for (var i = 0; i < NumberOfAdapters; ++i)
                                        {
                                            if (OSAdapterInfoData.ADLAdapterInfo[i].AdapterName == boardName && !taken.Contains(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber))
                                            {
                                                boardCounter++;
                                            }
                                            while (i + 1 < NumberOfAdapters && OSAdapterInfoData.ADLAdapterInfo[i].BusNumber == OSAdapterInfoData.ADLAdapterInfo[i + 1].BusNumber)
                                            {
                                                ++i;
                                            }
                                        }
                                        if (boardCounter <= 1)
                                        {
                                            for (var i = 0; i < NumberOfAdapters; ++i)
                                            {
                                                if (OSAdapterInfoData.ADLAdapterInfo[i].AdapterName == boardName && !taken.Contains(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber))
                                                {
                                                    device.ADLAdapterIndex = i;
                                                    taken.Add(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber);
                                                    break;
                                                }
                                                while (i + 1 < NumberOfAdapters && OSAdapterInfoData.ADLAdapterInfo[i].BusNumber == OSAdapterInfoData.ADLAdapterInfo[i + 1].BusNumber)
                                                {
                                                    ++i;
                                                }
                                            }
                                        }
                                        else
                                        {
                                            OpenCLDummyLbryMiner dummyMiner = new OpenCLDummyLbryMiner(device);
                                            dummyMinerList.Add(dummyMiner);
                                            dummyMiner.Start();

                                            int[] activityTotalArray = new int[NumberOfAdapters];
                                            for (var i = 0; i < NumberOfAdapters; ++i)
                                            {
                                                activityTotalArray[i] = 0;
                                            }
                                            for (var j = 0; j < 10; ++j)
                                            {
                                                for (var i = 0; i < NumberOfAdapters; ++i)
                                                {
                                                    if (OSAdapterInfoData.ADLAdapterInfo[i].AdapterName == boardName && !taken.Contains(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber))
                                                    {
                                                        ADLPMActivity OSADLPMActivityData;
                                                        OSADLPMActivityData = new ADLPMActivity();
                                                        var activityBuffer = IntPtr.Zero;
                                                        size           = Marshal.SizeOf(OSADLPMActivityData);
                                                        activityBuffer = Marshal.AllocCoTaskMem((int)size);
                                                        Marshal.StructureToPtr(OSADLPMActivityData, activityBuffer, false);

                                                        if (null != ADL.ADL_Overdrive5_CurrentActivity_Get)
                                                        {
                                                            ADLRet = ADL.ADL_Overdrive5_CurrentActivity_Get(i, activityBuffer);
                                                            if (ADL.ADL_SUCCESS == ADLRet)
                                                            {
                                                                OSADLPMActivityData    = (ADLPMActivity)Marshal.PtrToStructure(activityBuffer, OSADLPMActivityData.GetType());
                                                                activityTotalArray[i] += OSADLPMActivityData.iActivityPercent;
                                                            }
                                                        }
                                                    }
                                                    while (i + 1 < NumberOfAdapters && OSAdapterInfoData.ADLAdapterInfo[i].BusNumber == OSAdapterInfoData.ADLAdapterInfo[i + 1].BusNumber)
                                                    {
                                                        ++i;
                                                    }
                                                }
                                                System.Threading.Thread.Sleep(100);
                                            }
                                            int candidate         = -1;
                                            int candidateActivity = 0;
                                            for (var i = 0; i < NumberOfAdapters; ++i)
                                            {
                                                if (OSAdapterInfoData.ADLAdapterInfo[i].AdapterName == boardName && !taken.Contains(OSAdapterInfoData.ADLAdapterInfo[i].BusNumber))
                                                {
                                                    if (candidate < 0 || activityTotalArray[i] > candidateActivity)
                                                    {
                                                        candidateActivity = activityTotalArray[i];
                                                        candidate         = i;
                                                    }
                                                }
                                                while (i + 1 < NumberOfAdapters && OSAdapterInfoData.ADLAdapterInfo[i].BusNumber == OSAdapterInfoData.ADLAdapterInfo[i + 1].BusNumber)
                                                {
                                                    ++i;
                                                }
                                            }
                                            device.ADLAdapterIndex = candidate;
                                            taken.Add(OSAdapterInfoData.ADLAdapterInfo[candidate].BusNumber);

                                            dummyMiner.Stop();
                                            for (int i = 0; i < 50; ++i)
                                            {
                                                if (dummyMiner.Stopped)
                                                {
                                                    break;
                                                }
                                                System.Threading.Thread.Sleep(100);
                                            }
                                            if (!dummyMiner.Stopped)
                                            {
                                                MainForm.Logger("Failed at matching OpenCL devices with ADL devices. Restarting...");
                                                System.Windows.Forms.Application.Exit();
                                            }
                                        }
                                    }
                                }
                            }
                            else
                            {
                                // Use openclDevice.PciBusIdAMD for matching.
                                foreach (var device in mDevices)
                                {
                                    var openclDevice = device.GetComputeDevice();
                                    if (device.GetVendor() == "AMD")
                                    {
                                        for (var i = 0; i < NumberOfAdapters; i++)
                                        {
                                            var IsActive = 0;
                                            if (null != ADL.ADL_Adapter_Active_Get)
                                            {
                                                ADLRet = ADL.ADL_Adapter_Active_Get(OSAdapterInfoData.ADLAdapterInfo[i].AdapterIndex, ref IsActive);
                                            }
                                            if (OSAdapterInfoData.ADLAdapterInfo[i].BusNumber == openclDevice.PciBusIdAMD &&
                                                (device.ADLAdapterIndex < 0 || IsActive != 0))
                                            {
                                                device.ADLAdapterIndex = OSAdapterInfoData.ADLAdapterInfo[i].AdapterIndex;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            MainForm.Logger("ADL_Adapter_AdapterInfo_Get() returned error code " + ADLRet.ToString());
                        }

                        // Release the memory for the AdapterInfo structure
                        if (IntPtr.Zero != AdapterBuffer)
                        {
                            Marshal.FreeCoTaskMem(AdapterBuffer);
                        }
                    }
                }
                return(true);
            }
            else
            {
                MainForm.Logger("Failed to initialize AMD Display Library.");
                return(false);
            }
        }
Пример #3
0
 public static extern int ADL_Overdrive5_CurrentActivity_Get(int iAdapterIndex, ref ADLPMActivity activity);
Пример #4
0
        public override void Update()
        {
            ADLTemperature adlt = new ADLTemperature();
              if (ADL.ADL_Overdrive5_Temperature_Get(adapterIndex, 0, ref adlt)
            == ADL.ADL_OK)
              {
            temperature.Value = 0.001f * adlt.Temperature;
            ActivateSensor(temperature);
              } else {
            temperature.Value = null;
              }

              ADLFanSpeedValue adlf = new ADLFanSpeedValue();
              adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_RPM;
              if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
            == ADL.ADL_OK)
              {
            fan.Value = adlf.FanSpeed;
            ActivateSensor(fan);
              } else {
            fan.Value = null;
              }

              adlf = new ADLFanSpeedValue();
              adlf.SpeedType = ADL.ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
              if (ADL.ADL_Overdrive5_FanSpeed_Get(adapterIndex, 0, ref adlf)
            == ADL.ADL_OK) {
            controlSensor.Value = adlf.FanSpeed;
            ActivateSensor(controlSensor);
              } else {
            controlSensor.Value = null;
              }

              ADLPMActivity adlp = new ADLPMActivity();
              if (ADL.ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref adlp)
            == ADL.ADL_OK)
              {
            if (adlp.EngineClock > 0) {
              coreClock.Value = 0.01f * adlp.EngineClock;
              ActivateSensor(coreClock);
            } else {
              coreClock.Value = null;
            }

            if (adlp.MemoryClock > 0) {
              memoryClock.Value = 0.01f * adlp.MemoryClock;
              ActivateSensor(memoryClock);
            } else {
              memoryClock.Value = null;
            }

            if (adlp.Vddc > 0) {
              coreVoltage.Value = 0.001f * adlp.Vddc;
              ActivateSensor(coreVoltage);
            } else {
              coreVoltage.Value = null;
            }

            coreLoad.Value = Math.Min(adlp.ActivityPercent, 100);
            ActivateSensor(coreLoad);
              } else {
            coreClock.Value = null;
            memoryClock.Value = null;
            coreVoltage.Value = null;
            coreLoad.Value = null;
              }
        }
Пример #5
0
        static void Main(string[] args)
        {
            IntPtr context = IntPtr.Zero;

            const int adapterIndex = 1;

            ADL_Main_Control_Create(1);

            int supported = 0;
            int enabled   = 0;
            int version   = 0;

            if (ADL_OK == ADL_Overdrive_Caps(adapterIndex, ref supported, ref enabled, ref version))
            {
                Console.WriteLine("supported: {0:D}", supported);
                Console.WriteLine("enabled: {0:D}", enabled);
                Console.WriteLine("version: {0:D}", version);
                Console.WriteLine("----------------------------------");
            }

            if (ADL2_Main_Control_Create(Main_Memory_Alloc, adapterIndex, ref context) == ADL_OK)
            {
                Console.WriteLine("Context is: {0:D}", context);

                if (ADL_OK == ADL2_Overdrive_Caps(context, adapterIndex, ref supported, ref enabled, ref version))
                {
                    Console.WriteLine("v2 supported: {0:D}", supported);
                    Console.WriteLine("v2 enabled: {0:D}", enabled);
                    Console.WriteLine("v2 version: {0:D}", version);
                    Console.WriteLine("----------------------------------");
                }

                int isAccessible = 0;
                if (ADL2_Adapter_Accessibility_Get(context, adapterIndex, ref isAccessible) == ADL_OK)
                {
                    Console.WriteLine("Adapter is accesible: {0:D}", isAccessible);
                }


                for (var powerIndex = 0; powerIndex < 4; powerIndex++)
                {
                    int power = 0;
                    if (ADL2_Overdrive6_CurrentPower_Get(context, adapterIndex, powerIndex, ref power) == ADL_OK)
                    {
                        Console.WriteLine("power query of {0:D} is => {1:F1}", powerIndex, power / 256f);
                    }
                    else
                    {
                        Console.WriteLine("power query error: {0:D}", powerIndex);
                    }
                }

                ADLODNPerformanceStatus performanceStatus = new ADLODNPerformanceStatus();
                if (ADL2_OverdriveN_PerformanceStatus_Get(context, adapterIndex, ref performanceStatus) == ADL_OK)
                {
                    Console.WriteLine("-------------");
                    Console.WriteLine("perf status:");
                    Console.WriteLine("\tcurrent bus speed => {0:D}", performanceStatus.iCurrentBusSpeed);
                    Console.WriteLine("\tcurrent bus lanes => {0:D}", performanceStatus.iCurrentBusLanes);
                    Console.WriteLine("\tmaximum bus lanes => {0:D}", performanceStatus.iMaximumBusLanes);
                    Console.WriteLine("\tgpu activity percent => {0:D}", performanceStatus.iGPUActivityPercent);
                    Console.WriteLine("\tcurrent core perf. level => {0:D}", performanceStatus.iCurrentCorePerformanceLevel);
                    Console.WriteLine("\tcurrent dcef perf. level => {0:D}", performanceStatus.iCurrentDCEFPerformanceLevel);
                    Console.WriteLine("\tcurrent gfx  perf. level => {0:D}", performanceStatus.iCurrentGFXPerformanceLevel);
                    Console.WriteLine("\tcurrent mem. perf. level => {0:D}", performanceStatus.iCurrentMemoryPerformanceLevel);
                    Console.WriteLine("\tcore clock => {0:D}", performanceStatus.iCoreClock);
                    Console.WriteLine("\tdcef clock => {0:D}", performanceStatus.iDCEFClock);
                    Console.WriteLine("\tgxf  clock => {0:D}", performanceStatus.iGFXClock);
                    Console.WriteLine("\tmem. clock => {0:D}", performanceStatus.iMemoryClock);
                    Console.WriteLine("\tuvd  clock => {0:D}", performanceStatus.iUVDClock);
                    Console.WriteLine("\tuvd perf. level => {0:D}", performanceStatus.iUVDPerformanceLevel);
                    Console.WriteLine("\tvce  clock => {0:D}", performanceStatus.iVCEClock);
                    Console.WriteLine("\tvce perf level => {0:D}", performanceStatus.iVCEPerformanceLevel);
                    Console.WriteLine("\tvddc => {0:D}", performanceStatus.iVDDC);
                    Console.WriteLine("\tvddci => {0:D}", performanceStatus.iVDDCI);
                    Console.WriteLine("-------------");
                }

                ADLPMActivity activity = new ADLPMActivity();
                if (ADL_Overdrive5_CurrentActivity_Get(adapterIndex, ref activity) == ADL_OK)
                {
                    Console.WriteLine("-------------");
                    Console.WriteLine("activity:");
                    Console.WriteLine("\tacivity percent => {0:D}", activity.iActivityPercent);
                    Console.WriteLine("\tcurrent bus lanes => {0:D}", activity.iCurrentBusLanes);
                    Console.WriteLine("\tcurrent bus speed => {0:D}", activity.iCurrentBusSpeed);
                    Console.WriteLine("\tcurrent perf. level => {0:D}", activity.iCurrentPerformanceLevel);
                    Console.WriteLine("\tengine clock => {0:D}", activity.iEngineClock);
                    Console.WriteLine("\tmax. bus lanes => {0:D}", activity.iMaximumBusLanes);
                    Console.WriteLine("\tmemory clock => {0:D}", activity.iMemoryClock);
                    Console.WriteLine("\treserved => {0:D}", activity.iReserved);
                    Console.WriteLine("\tsize => {0:D}", activity.iSize);
                    Console.WriteLine("\tvddc => {0:D}", activity.iVddc);
                    Console.WriteLine("-------------");
                }

                Console.WriteLine("-------------");
                Console.WriteLine("teperatures:");
                foreach (var sensor in GPUTemperatureSensorIndexes)
                {
                    int temp = 0;
                    //ADLTemperature adlt = new ADLTemperature();
                    //if (ADL_Overdrive5_Temperature_Get(1, 0, ref adlt) == ADL_OK)
                    int res = ADL2_OverdriveN_Temperature_Get(context, adapterIndex, sensor.Key, ref temp);
                    if (res == ADL_OK)
                    {
                        if (sensor.Key == 1)
                        {
                            temp /= 1000;
                        }
                        Console.WriteLine("\t{0:S} Temperature: {1:D}", sensor.Value, temp);
                        //Console.WriteLine(adlt.Temperature);
                    }
                    else
                    {
                        Console.WriteLine("error: {0:D}", res);
                    }
                }
                Console.WriteLine("-------------");

                Console.WriteLine("log data (without settings check):");
                ADLPMLogDataOutput logDataOutput = new ADLPMLogDataOutput();
                if (ADL2_New_QueryPMLogData_Get(context, adapterIndex, ref logDataOutput) == ADL_OK)
                {
                    Console.WriteLine("\tLog Data Output size: {0:D}", logDataOutput.size);
                    for (int i = 0; i < logDataOutput.size; i++)
                    {
                        Console.WriteLine("\tSensor type: {0:S} Value: {1:D}", Enum.GetName(typeof(ADLSensorType), i), logDataOutput.sensors[i].value);
                    }
                }

                ADL2_Main_Control_Destroy(context);
                ADL_Main_Control_Destroy();
            }
            else
            {
                Console.WriteLine("Alloc failed");
            }
            Console.ReadKey();
        }