Показать сообщение отдельно
  #3  
Старый 03.01.2018, 17:21
Prok186 Prok186 вне форума
Прохожий
 
Регистрация: 19.06.2011
Сообщения: 22
Репутация: 10
По умолчанию продолжение кода

Код:
//...... Для получении информации о загрузке GPU-AMD и частотах .......
type ADLOD6CurrentStatus = packed record
    iEngineClock : Integer;      // Current engine frequency [in 10KHz]
    iMemoryClock : Integer;      // Current memory frequency [in 10KHz]
// Current GPU activity in percent, this indicates how busy the GPU is
    iActivityPercent : Integer;
    iCurrentPerformanceLevel : Integer;   // Reserved for future use
    iCurrentBusSpeed : Integer;  // Current PCI-E bus speed
    iCurrentBusLanes : Integer;  // Current PCI-E bus # of lanes
    iMaximumBusLanes : Integer;  // Max possible PCI-E bus # of lanes
    iExtValue : Integer;         // Value for future extension
    iExtMask : Integer;          // Mask for future extension
   end;
  pADLOD6CurrentStatus =  ^ADLOD6CurrentStatus;

//.......... Для получении информации о памяти на борту AMD ...........
type ADLMemoryInfo = packed record
    iMemorySize : Int64;       // Memory size in bytes
// Только AnsiChar позволяет прочитать тип памяти из следующей строки
    strMemoryType: array[0..255] of AnsiChar;
    iMemoryBandwidth : Int64;  // Memory bandwidth in Mbytes/s.
   end;
  pADLMemoryInfo = ^ADLMemoryInfo;

//........ Для получении информации о скорости вентилятора AMD ........
const ADL_DL_FANCTRL_SPEED_TYPE_PERCENT      = 1;
      ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED = 1;

type ADLFanSpeedValue = packed record
    iSize : Integer;   // Must be set to the size of the structure
// Possible values: ADL_DL_FANCTRL_SPEED_TYPE_PERCENT or
//  ADL_DL_FANCTRL_SPEED_TYPE_RPM
    iSpeedType : Integer;
    iFanSpeed : Integer;   // Fan speed value
// The only flag for now is: ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED
    iFlags : Integer;
   end;
  pADLFanSpeedValue = ^ADLFanSpeedValue;
//
//=====================================================================
var  // Описываем прототипы вызываемых из atiadlxx.dll функций
  ADL_Main_Control_Create : function(
    callback : pADL_MAIN_MALLOC_CALLBACK;
    iEnumConnectedAdapters : Integer) :  nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Main_Control_Destroy: function() :  nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Overdrive6_CurrentStatus_Get : function(iAdapterIndex : Integer;
    pCurrentStatus : pADLOD6CurrentStatus) :  nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Adapter_NumberOfAdapters_Get : function(pNumAdapters : pInt) :
    nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Adapter_Active_Get : function(iAdapterIndex : Integer;
    pStatus : pInt) : nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Overdrive6_Temperature_Get : function(iAdapterIndex : Integer;
    pTemp : pInt) :  nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Overdrive5_FanSpeed_Get : function(iAdapterIndex : Integer;
    iThermalControllerIndex : Integer;
    pFanSpeedValue : pADLFanSpeedValue) : nvmlReturn_t;  stdcall;
//.....................................................................
  ADL_Adapter_MemoryInfo_Get : function(iAdapterIndex : Integer;
    pMemoryInfo: pADLMemoryInfo) : nvmlReturn_t;  stdcall;
//.....................................................................

var GPU_count_NVIDIA, GPU_count_AMD: Integer; //UInt;
    LibHandleNV, LibHandleAMD: THandle;
    ShowMesAMD : Boolean;
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++ Инициализация функций из библиотек nvml.dll и atiadlxx.dll +++++
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
procedure GPUusageInitialize;
var MaxAMD, iAdapterAMD, StatusAMD : Integer;
//.... По умолчанию устанавливается только версия библиотеки 64bit ....
// См.  https://devtalk.nvidia.com/default/topic/525514/
//   can-39-t-find-nvml-dll-in-display-drivers/
const nvml_Lib = 'C:\Program Files\NVIDIA Corporation\NVSMI\nvml.dll';
begin
//
ShowMesAMD := True;
//====  Сначала пытаемся инициализировать библиотеку для NVIDIA  ======
   Try
// Проверим, существует ли по указанному пути файл библиотеки nvml.dll
   If not FileExists(nvml_Lib) then raise EAbort.Create('');
   LibHandleNV := LoadLibrary(nvml_Lib);
// Если не удалось загрузить библиотеку nvml.dll
   If LibHandleNV = 0 then raise EAbort.Create('');
// Определяем адреса всех необходимых процедур из библиотеки NVIDIA
   @nvmlInit := GetProcAddress(LibHandleNV, 'nvmlInit');
   @nvmlShutdown := GetProcAddress(LibHandleNV, 'nvmlShutdown');
   @nvmlDeviceGetCount :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetCount');
   @nvmlDeviceGetHandleByIndex :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetHandleByIndex');
   @nvmlDeviceGetUtilizationRates :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetUtilizationRates');
   @nvmlDeviceGetMemoryInfo :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetMemoryInfo');
   @nvmlDeviceGetTemperature :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetTemperature');
   @nvmlDeviceGetClockInfo :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetClockInfo');
   @nvmlDeviceGetFanSpeed :=
     GetProcAddress(LibHandleNV, 'nvmlDeviceGetFanSpeed');
// Инициализация функций библиотеки nvml.dll
   If nvmlInit() <> 0 then raise EAbort.Create('');
// Определение кол-ва GPU в конкретной системе : только для контроля
   If nvmlDeviceGetCount(@GPU_count_NVIDIA) <> 0 then
    raise EAbort.Create('');
   Initialize_NVIDIA_OK := True;
   except
   Initialize_NVIDIA_OK := False;     FreeLibrary(LibHandleNV);
   end;
//
//======  Далее пытаемся инициализировать библиотеку для AMD  =========
   Try
   LibHandleAMD := LoadLibrary('atiadlxx.dll');
// Если не удалось загрузить библиотеку atiadlxx.dll
   If LibHandleAMD = 0 then raise EAbort.Create('');
// Определяем адреса всех необходимых процедур из библиотеки AMD
   @ADL_Main_Control_Create :=
    GetProcAddress(LibHandleAMD, 'ADL_Main_Control_Create');
   @ADL_Main_Control_Destroy :=
    GetProcAddress(LibHandleAMD, 'ADL_Main_Control_Destroy');
   @ADL_Overdrive6_CurrentStatus_Get :=
    GetProcAddress(LibHandleAMD, 'ADL_Overdrive6_CurrentStatus_Get');
   @ADL_Adapter_NumberOfAdapters_Get :=
    GetProcAddress(LibHandleAMD, 'ADL_Adapter_NumberOfAdapters_Get');
   @ADL_Adapter_Active_Get :=
    GetProcAddress(LibHandleAMD, 'ADL_Adapter_Active_Get');
   @ADL_Overdrive6_Temperature_Get :=
    GetProcAddress(LibHandleAMD, 'ADL_Overdrive6_Temperature_Get');
   @ADL_Overdrive5_FanSpeed_Get :=
    GetProcAddress(LibHandleAMD, 'ADL_Overdrive5_FanSpeed_Get');
   @ADL_Adapter_MemoryInfo_Get :=
    GetProcAddress(LibHandleAMD, 'ADL_Adapter_MemoryInfo_Get');
//
//....... Определяем GPU_HandleAMD (инициализация функций AMD) ........
// 2-ой парметр = 0 : значит, что для всех доступных AMD-устройств
   If ADL_Main_Control_Create(@MyMALLOC, 0) <> 0
    then raise EAbort.Create('');
//
//=====> Получаем информацию об общем количестве адаптеров AMD <=======
   If ADL_Adapter_NumberOfAdapters_Get(@MaxAMD) <> 0
    then raise EAbort.Create('');
//......... Подсчитаем количество активных адаптеров AMD ..............
   GPU_count_AMD := 0; // На моноблоке ASUS ET2702i вышло MaxAMD = 6 !
      For iAdapterAMD := 0 to MaxAMD - 1 do begin
      If ADL_Adapter_Active_Get(iAdapterAMD, @StatusAMD) <> 0
       then raise EAbort.Create('');
      If StatusAMD <> 0 then Inc(GPU_count_AMD);
      end;
//.....................................................................
   Initialize_AMD_OK := True;
   except
   Initialize_AMD_OK := False;     FreeLibrary(LibHandleAMD);
   end;
end;
//
Ответить с цитированием