FAQ VCL
Железо\Процессор

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как определить версию CPUID?

function GetCPUID: Longint; assembler; register;
asm
   mov eax, 1
   dw $A20F {db $0F, $A2}
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  CPUID: Longint;
begin
   CPUID := GetCPUID;
   ShowMessage( IntToHex( CPUID, 8 ) );
end;


Как определить, доступен ли CPUID?

function IsCPUIDAvailable: boolean; assembler; register;
asm
   pushfd
   pop eax
   mov edx, eax
   xor eax, 200000h
   push eax
   popfd
   pushfd
   pop eax
   xor eax,edx
   jz @exit
   mov al,true
@exit:
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if IsCPUIDAvailable then
      Caption := 'Доступен'
   else
      Caption := 'Недоступен';
end;


Как узнать текущее значение счетчика производительности?

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Int64;
begin
   QueryPerformanceCounter( i );
   ShowMessage( IntToStr( i ) );
end;


Как узнать число тактов счетчика производительности в секунду?

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Int64;
begin
   QueryPerformanceFrequency( i );
   ShowMessage( IntToStr( i ) );
end;


Как узнать имя процессора?

uses
  Registry;

function GetProcessorName: string;
var
  Reg: TRegistry;
begin
   Reg := TRegistry.Create;
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   try
      Reg.OpenKeyReadOnly( 'HARDWARE\DESCRIPTION\System\CentralProcessor\0' );
      Result := Reg.ReadString( 'ProcessorNameString' );
   finally
      Reg.CloseKey;
      Reg.Free;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage( GetProcessorName );
end;


Как отключить возбуждение исключений при выполнении операций в FPU?

uses
  Math;

// При помощи настройки регистра "управляющее слово" (Control Word) можно
// отключить возбуждение исключений на ошибки при выполнение операций в FPU,
// "заставив" FPU возвращать значения NaN, +INF, -INF.
procedure TForm1.Button1Click(Sender: TObject);
var
  CW: Word;
begin
   CW := Get8087CW;
   System.Set8087CW($133f); // Отключаем исключения

   ShowMessage((1/0).ToString);
   ShowMessage((-1/0).ToString);
   ShowMessage((0/0).ToString);
   ShowMessage((Infinity/Infinity).ToString);

   System.Set8087CW(CW); // Восстанавливаем значение регистра
end;


Как очистить кэш команд процессора?

procedure HookFunction(const ATargetFunction, AHandler: Pointer);
const
  MaxPossibleSize = 8;
var
  OldProtectionCode: Cardinal;
begin
   VirtualProtect(ATargetFunction, MaxPossibleSize, PAGE_READWRITE, @OldProtectionCode);
   try
      // какее-то действия, не имеющие значения для этой задачки
      // PByte(@ATargetFunction)^ := $E9;
   finally
      VirtualProtect(ATargetFunction, MaxPossibleSize, OldProtectionCode, @OldProtectionCode);
      FlushInstructionCache(GetCurrentProcess, ATargetFunction, SizeOf(DWORD){8}); // очистка кэша
   end;
end;

При использовании материала - ссылка на сайт обязательна