Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Узнать частоту ядра процессора / 16 сообщений из 16, страница 1 из 1
22.11.2021, 16:12
    #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
22.11.2021, 17:01
    #40113835
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
Тебе нужно узнать паспортные данные на железо? Или посмотреть мгновенное значение
которое показывает TaskManager Windows?
...
Рейтинг: 0 / 0
22.11.2021, 17:30
    #40113857
Ежов Дмитрий Сергеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
посмотреть мгновенное значение task manager
...
Рейтинг: 0 / 0
22.11.2021, 18:14
    #40113900
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
может тебе wmi будет удобнее чем ассемблер?
...
Рейтинг: 0 / 0
22.11.2021, 18:33
    #40113909
Ежов Дмитрий Сергеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
makhaon,

wmi - это зависимость от служб Windows. Вроде есть такая служба, при отключении которой, WMI запросы не работают. Не хотелось бы.
...
Рейтинг: 0 / 0
22.11.2021, 18:44
    #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
22.11.2021, 20:29
    #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
22.11.2021, 20:33
    #40113964
Ежов Дмитрий Сергеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
Ежов Дмитрий Сергеевич,

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

https://prnt.sc/20j1axs

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

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

QueryPerformanceFrequency()
вообще возвращает 10 Мгц.
...
Рейтинг: 0 / 0
22.11.2021, 20:41
    #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
22.11.2021, 20:44
    #40113975
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
Ежов Дмитрий Сергеевич
QueryPerformanceFrequency() вообще возвращает 10 Мгц.
А GetTickCount случайное число. Только какое эти функции имеют отношение к частоте процессора?
...
Рейтинг: 0 / 0
22.11.2021, 23:09
    #40114027
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Узнать частоту ядра процессора
Ежов Дмитрий Сергеевичmore the same

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

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

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

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

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

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


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