powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать частоту ядра процессора
16 сообщений из 16, страница 1 из 1
Узнать частоту ядра процессора
    #40113813
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую RdTSC вида

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
type
  TTicks64 = type Int64; // signed, so that deltas can be represented cleanly

  /// ////////////////////////////////////////////////////////////////////////////////////////////////
  // CPUID implements a full barrier; it doesn't influence the timing as it is called before RDTSC.
  // Full story: ia-32-ia-64-benchmark-code-execution-paper.pdf

function RdTSC0: TTicks64; // the 'before' tick
asm
  {$IFDEF CPUX64}
  xor   rax, rax
  push  rbx          // Delphi requires EBX/RBX to be preserved
  cpuid              // full fence
  pop   rbx
  rdtsc
  shl   rdx, 32
  or    rax, rdx
  {$ELSE}
  xor   eax, eax
  push  ebx
  cpuid
  pop   ebx
  rdtsc
  {$ENDIF}
end;

// --------------------------------------------------------------------------------------------------
// RDTSCP implements a sort of read fence: it waits until all preceding instructions in the stream
// have been executed but it doesn't keep later instruction from jumping the queue. That's why the
// RDTSCP is bracketed by CPUID from behind.

function RdTSC1: TTicks64; // the 'after' tick
asm
  {$IFDEF CPUX64}
  {$IFDEF ZX_dont_use_RDTSCP}
  rdtsc
  {$ELSE}
  rdtscp
  {$ENDIF}
  shl   rdx, 32
  or    rdx, rax
  xor   rax, rax
  push  rbx
  push  rdx
  cpuid
  pop   rax
  pop   rbx
  {$ELSE}
  {$IFDEF ZX_dont_use_RDTSCP}
  rdtsc
  {$ELSE}
  db    $0F, $01, $F9  // rdtscp; X2 understands the mnemonic for x64 but not for x86
  {$ENDIF}
  push  eax
  xor   eax, eax
  push  edx
  push  ebx
  cpuid
  pop   ebx
  pop   edx
  pop   eax
  {$ENDIF}
end;

// -------------------------------------------------------------------------------------------------
// for flank-to-flank measurements

function rdtscp: TTicks64;
asm
  {$IFDEF CPUX64}
  {$IFDEF ZX_dont_use_RDTSCP}
  rdtsc
  {$ELSE}
  rdtscp
  {$ENDIF}
  shl   rdx, 32
  or    rax, rdx
  {$ELSE}
  {$IFDEF ZX_dont_use_RDTSCP}
  rdtsc
  {$ELSE}
  db    $0F, $01, $F9  // rdtscp; X2 understands the mnemonic for x64 but not for x86
  {$ENDIF}
  {$ENDIF}
end;



и его вызовы вот так

procedure TForm1.Button1Click(Sender: TObject);
var
CounterStart: Int64;
CounterStop: Int64;
begin
CounterStart := rdtsc0;

sleep(1000);
CounterStop := rdtsc0;

ShowMessage(inttostr(round((CounterStop - CounterStart) / 1000 / 1000)));

end;

и получаю четко свою БАЗОВУЮ частоту ядра процессора: 3600 МГц для i5-8600k, хотя у меня высокая производительность и ядра работают на 4.2 ГГц.

Думал, может ядро засыпает. Нагружал все ядра проца CPU-Z в StressBenchmark, но все равно 3600 МГц.

Что я упускаю?
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113835
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе нужно узнать паспортные данные на железо? Или посмотреть мгновенное значение
которое показывает TaskManager Windows?
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113857
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотреть мгновенное значение task manager
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113900
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может тебе wmi будет удобнее чем ассемблер?
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113909
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

wmi - это зависимость от служб Windows. Вроде есть такая служба, при отключении которой, WMI запросы не работают. Не хотелось бы.
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113910
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вторая ссылка гугля:
https://stackoverflow.com/questions/7544049/win32-api-function-to-get-processors-current-speed
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113960
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
more the same (тех же щей)

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
function CallNtPowerInformation(InformationLevel: Byte; lpInputBuffer: Pointer; nInputBufferSize: Longint; lpOutputBuffer: Pointer; nOutputBufferSize: Longint): Byte; stdcall; external 'PowrProf.dll';
type
  TPINFO = record
    Number: UINT;
    MaxMh: UINT;
    CurrentMhz: UINT;
    MhzLimit: UINT;
    MaxIdleState: UINT;
    CurrentIdleState: UINT;
  end;

  Function DummyThread(Param:pointer):Cardinal;stdcall;
  var x:integer; y:real;
  begin
    x:=0;
    while true do begin
    y:=cos(x);
    inc(x);
    if x>100000 then x:=0;
    end;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SI:_SYSTEM_INFO;
  NumberOfProcessors:Cardinal;
  PINFO: Array of TPINFO;
  res: Byte;
  resBool:Boolean;
  PID:Cardinal;
  ProcessAffinityMask: Cardinal;
  hProcess,hThread:THandle;
begin
  hProcess:=GetCurrentProcess();
  ProcessAffinityMask:=0;
  ProcessAffinityMask:=ProcessAffinityMask or (1 shl 1);
  resBool:=SetProcessAffinityMask(hProcess,ProcessAffinityMask);
  if resBool=false then begin
    ShowMessage(_GetErrorMsg(GetLastError));
    exit;
  end;
  GetSystemInfo(SI);
  NumberOfProcessors:=SI.dwNumberOfProcessors;
  hThread:=CreateThread(nil,0,@DummyThread,nil,0,PID);
  sleep(3000);
  SetLength(PINFO, NumberOfProcessors);
  ZeroMemory(@PINFO[0], sizeOf(TPINFO) * NumberOfProcessors);
  res := CallNtPowerInformation(11, nil, 0, @PINFO[0], sizeOf(TPINFO) * NumberOfProcessors);
  ShowMessage('CurrentMhz:'+inttostr(PINFO[0].CurrentMhz)+'//MaxMh:'+inttostr(PINFO[0].MaxMh));
  TerminateThread(hThread,0);
end;
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113964
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежов Дмитрий Сергеевич,

Вешаю приложение на 2 ядро, запускаю на нем нагружающий поток, меряю частоту, получаю базовую.

https://prnt.sc/20j1axs

Можно погрешить на кривую настройку компа, схемы питания, но ровно туже картину получаю на настроенном промышленном сервере.

https://prnt.sc/20j1kbd
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113971
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

QueryPerformanceFrequency()
вообще возвращает 10 Мгц.
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113972
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежов Дмитрий Сергеевич
Код: pascal
1.
2.
3.
4.
5.
6.
function CallNtPowerInformation(InformationLevel: Byte; lpInputBuffer: Pointer; nInputBufferSize: Longint;
  lpOutputBuffer: Pointer; nOutputBufferSize: Longint): Byte; stdcall; external 'PowrProf.dll';
  ........
  res := CallNtPowerInformation(11, nil, 0, @PINFO[0], sizeOf(TPINFO) * NumberOfProcessors);
  ShowMessage('CurrentMhz:'+inttostr(PINFO[0].CurrentMhz)+'//MaxMh:'+inttostr(PINFO[0].MaxMh));
end;

1. Выделенное заменить на Cardinal
2. Возвращаемое значение нужно анализировать
3. Нужно выводить информацию по всем процессорам
4. На основании чего делается вывод, что функция возвращает некорректное значение?
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40113975
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежов Дмитрий Сергеевич
QueryPerformanceFrequency() вообще возвращает 10 Мгц.
А GetTickCount случайное число. Только какое эти функции имеют отношение к частоте процессора?
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40114027
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежов Дмитрий Сергеевичmore the same

Остальные ядра тоже посмотри. Может, нулевое реально не в бусте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40114103
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

все ядра на базовой частоте.
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40114323
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кому интересно, нашел вот такой проект
https://github.com/anrieff/libcpuid

пришлось поставить C#, полюбиться с развертыванием и понять.
Они ставят sys драйвер в режиме Ring0 как службу венды. Этот драйвер (автор Нориюки Миядзаки, разраб CrystalDiskInfo) позволяет читать служебные регистры проца, они в своем проекте их читают с разными фишечками для ранних интелов и AMD.

Пожалуй, тему отложим...
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40114381
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ежов Дмитрий Сергеевич,

я ж сразу говорил WMI, но видно не очень нужно
...
Рейтинг: 0 / 0
Узнать частоту ядра процессора
    #40114510
Фотография Ежов Дмитрий Сергеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

да не, просто дождаться выходных, там победим.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать частоту ядра процессора
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]