03.01.2018, 17:21
|
Прохожий
|
|
Регистрация: 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;
//
|