Показать сообщение отдельно
  #4  
Старый 05.01.2018, 15:18
Prok186 Prok186 вне форума
Прохожий
 
Регистрация: 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.
Ответить с цитированием