05.01.2018, 15:18
|
Прохожий
|
|
Регистрация: 19.06.2011
Сообщения: 22
Репутация: 10
|
|
последний 3-й фрагмент кода
Код:
procedure NVIDIA_Shutdown; forward;
//=====================================================================
//===== Определение загрузки NVIDIA-GPU с номером GPU_num (от 0) ======
//=====================================================================
procedure GPUusageNVIDIA(const GPU_num : Byte;
out GPU_usage, MemoryController, Memory, // Всё в процентах
Temperature, // degrees C
GPU_freq, MEM_freq, // MHz
FanSpeed : Integer); // Скорость вентилятора в %
var GPU_Handle : nvmlDevice_t; UtilGPU : nvmlUtilization_t;
MemGPU : nvmlMemory_t; nvmlValue : UInt;
begin
//!!! Значение -1 -это признак, что параметр не удалось определить !!!!
GPU_usage := -1; MemoryController := -1; Memory := -1;
GPU_freq := -1; MEM_freq := -1;
Temperature := -1; FanSpeed := -1;
If Initialize_NVIDIA_OK and (GPU_num < GPU_count_NVIDIA) then try
//
//=============> Определение Handle для выбранного GPU <===============
If nvmlDeviceGetHandleByIndex(GPU_num, @GPU_Handle) <> 0
then raise EAbort.Create('');
// След. вызовы будут с ошибками, если nvml.dll от другой видеокарты!!
//
//====> Получаем информацию о загрузке потоковых процессоров GPU <=====
If nvmlDeviceGetUtilizationRates(GPU_Handle, @UtilGPU) = 0
then begin
GPU_usage := UtilGPU.GPU; MemoryController := UtilGPU.Mem;
end;
//
//=======> Получаем информацию об использовании памяти GPU <===========
If nvmlDeviceGetMemoryInfo(GPU_Handle, @MemGPU) = 0
then Memory := Round( 100 * MemGPU.Used / MemGPU.Total );
//
//=============> Получаем информацию о температуре GPU <===============
If nvmlDeviceGetTemperature(GPU_Handle, 0, @nvmlValue) = 0
then Temperature := nvmlValue;
//
//=====> Получаем информацию о частотах процессора и памяти GPU <======
If nvmlDeviceGetClockInfo(GPU_Handle, NVML_CLOCK_GRAPHICS,
@nvmlValue) = 0 then GPU_freq := nvmlValue;
If nvmlDeviceGetClockInfo(GPU_Handle, NVML_CLOCK_MEM,
@nvmlValue) = 0 then MEM_freq := nvmlValue;
//
//========> Получаем информацию о скорости вентилятора GPU <===========
If nvmlDeviceGetFanSpeed(GPU_Handle, @nvmlValue) = 0
then FanSpeed := nvmlValue; //...в процентах, а не в RPM
except
NVIDIA_Shutdown;
end;
// Если не удалось определить ни одного параметра, отключаем библиотеку
If GPU_usage + MemoryController + Memory + GPU_freq + MEM_freq +
Temperature + FanSpeed = -7 then NVIDIA_Shutdown;
end;
//
procedure AMD_Shutdown; forward;
//=====================================================================
//======= Определение загрузки AMD-GPU с номером GPU_num (от 0) =======
//=====================================================================
procedure GPUusageAMD(const GPU_num : Byte;
out GPU_usage, Temperature, GPU_freq, Mem_freq, FanSpeed : Integer);
var Temp : Integer;
AMD_Status : ADLOD6CurrentStatus;
MemoryInfo : ADLMemoryInfo; MemoryType : String;
FanSpeedValue : ADLFanSpeedValue;
const CRLF = #13#10; // Переход на новую строку для ShowMessage
begin
//!!! Значение -1 -это признак, что параметр не удалось определить !!!!
GPU_usage := -1; GPU_freq := -1; MEM_freq := -1;
Temperature := -1; FanSpeed := -1;
If Initialize_AMD_OK and (GPU_num < GPU_count_AMD) then try
//
//====> Получаем информацию о загрузке потоковых процессоров GPU <=====
If ADL_Overdrive6_CurrentStatus_Get(GPU_num, @AMD_Status) = 0
then begin
GPU_usage := AMD_Status.iActivityPercent;
// Частоты для AMD в десятках KHz - сразу переведём в MHz
GPU_freq := Round(0.01 * AMD_Status.iEngineClock);
MEM_freq := Round(0.01 * AMD_Status.iMemoryClock);
end;
//
//=============> Получаем информацию о температуре GPU <===============
If ADL_Overdrive6_Temperature_Get(GPU_num, @Temp) = 0 then
Temperature := Round(0.001 * Temp); // Temp была в милли-градусах C
//
//========> Получаем информацию о скорости вентилятора GPU <===========
FanSpeedValue.iSize := SizeOf(ADLFanSpeedValue);
FanSpeedValue.iFlags := ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED;
FanSpeedValue.iSpeedType := ADL_DL_FANCTRL_SPEED_TYPE_PERCENT;
If ADL_Overdrive5_FanSpeed_Get(GPU_num, 0, @FanSpeedValue) = 0
then FanSpeed := FanSpeedValue.iFanSpeed;
//
//...... Один раз покажем информацию о памяти на борту GPU-AMD ........
If ShowMesAMD then begin
ShowMesAMD := False;
//===> Получаем информацию об общем количестве памяти на борту GPU <===
If ADL_Adapter_MemoryInfo_Get(GPU_num, @MemoryInfo) = 0
then begin
// Переводим AnsiString --> String , контролируем длину строки
MemoryType := String(MemoryInfo.strMemoryType);
ShowMessage('Active GPU_count_AMD = ' +
IntToStr(GPU_count_AMD) + CRLF +
'Memory (' + MemoryType + ') = ' +
IntToStr(Round(MemoryInfo.iMemorySize / (1024*1024))) +
' MBytes' + CRLF + 'MemoryType string Length = ' +
IntToStr(Length(MemoryType)) + CRLF + 'Memory Bandwidth= ' +
IntToStr(MemoryInfo.iMemoryBandwidth) + ' MBytes/s');
end;
end;
except
AMD_Shutdown;
end;
// Если не удалось определить ни одного параметра, отключаем библиотеку
If GPU_usage + GPU_freq + MEM_freq +
Temperature + FanSpeed = -5 then AMD_Shutdown;
end;
//
//---------------------------------------------------------------------
//----------- Отключение библиотек nvml.dll и atiadlxx.dll ------------
//---------------------------------------------------------------------
procedure NVIDIA_Shutdown;
begin
If Initialize_NVIDIA_OK then try
Initialize_NVIDIA_OK := False; nvmlShutdown();
finally
FreeLibrary(LibHandleNV);
end;
end;
//.....................................................................
procedure AMD_Shutdown;
begin
If Initialize_AMD_OK then try
Initialize_AMD_OK := False; ADL_Main_Control_Destroy();
finally
FreeLibrary(LibHandleAMD);
end;
end;
//.....................................................................
procedure GPUusageShutdown;
begin
NVIDIA_Shutdown; AMD_Shutdown;
end;
end.
|