Точное определение частоты CPU

Тема в разделе "WASM.ASSEMBLER", создана пользователем mr_Infern0, 4 май 2007.

  1. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    Может кто-нибудь подскажет как точно оперделить частоту камня этот код даёт не точный результат (даже с realtime приоритетом)

    Код (Text):
    1. rdtsc
    2. mov TimerLow, EAX
    3. mov TimerHigh, EDX
    4. push 1000
    5. call Sleep
    6. rdtsc
    7. sub EAX, TimerLow
    8. sbb EDX, TimerHigh
    9.  
    10. EAX=CPU freq
    а CPUId и прочие проги дают очень точный результат, возможно они не вычисляют, а считывают частоту (FSB, множители), но откуда?

    З. Ы. Толковой доки на эту тему я не нашёл (наверно плохо искал).
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Sleep отпускает процессор и с большой вероятностью вгоняет его в hlt, а современные звери в простое имеют тенденцию сбрасывать частоту (ну а че зря напрягаться :)).
    Кстати, CPU-Z это отражает.
    И с чего ты взял, что частота должна быть очень точной?
     
  3. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    Просто интересно откуда SiSoft sandra, CPU-Z берут FSB и множитель (соотв. получают freq с точностью до 1 Mhz, а моя прога +-20 Mhz :dntknw:, что не есть гуд), может из MSR.
    Дебаггить CPU-Z и разбираться в нём нет желания.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    mr_Infern0
    Для повышения точности достаточно замерить реальное время Sleep(100) по QueryPerformanceXXX. См. пример
     
  5. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    Вполне юзабельно, но всё-же может кто знает где лежит значение FSB, multiplier.
    Я имею ввиду что-то типа:
    Код (Text):
    1. mov DX, PORT_CPU_PARAMETERS
    2. mov EAX, XX
    3. out DX, EAX
    4. in EAX, DX ; EAX=FSB
    или

    Код (Text):
    1. mov EСX, MSR_REG_CPU_PARAMETERS
    2. rdmsr ; EAX=FSB
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Некторые проги тупо из реестра берут %)
    [HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0]
     
  7. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    censored

    Всё чё там есть система получает ч-з cpuid, rdtsc, а это не рулит. Да и вообще читать из реестра это по ламерски.
     
  8. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    mr_Infern0
    а) убери Sleep, вставь нормальную функцию типа GetTickCount;
    б) выполняй цикл (неважно какой, главное, выполняй) хотя бы ~0.1 сек;
    в) считай кол-во таков с помощью rdtsc;
    г) измеряй время выполнения через GetTickCount;
    д) вычисляй результат, округляя результат до целых MHz;
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    kaspersky
    Удивительно от Тебя такое слышать :о
    GetTickCount выдает результат с погрешностью 10-15 мс, соответственно для измеряемого интервала ~0.1 сек точность измерения будет ~10^(-1), а для 1 сек соотв-но ~10^(-2), что собс-но и получил mr_Infern0 при Sleep(1000) - "моя прога +-20 Mhz "
    Поэтому величину интервала нужно замерять точнее с помощью QueryPerformance (см. пост #4)
     
  10. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    Неужели нет человеческого способа узнать частоту CPU (не вычислять её) :dntknw:
    Где-то она должна лежать в виде числа (IMHO БИОС при запуске ни rdtsc, ни QueryPerfomance :) не юзает).
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    частотомер попробуй, все люди так измеряют частоту!

    а ссылку на обсуждение тебе уже дали http://www.wasm.ru/forum/viewtopic.php?pid=146061#p146061

    там нормально определяется частота, единственная трабла - полученный способ не работает на x86-64 процах.
     
  12. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    RamMerLabs
    И почему же, интересно знать
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    mr_Infern0
    В качестве числа, а вернее строки можно получить из самого процессора, она в нем зашита. Команда CPUID.

    А реальная частота может отличаться. Меряют таймером. Причем в старых процессорах где CPUID не было частоту тоже определяли по таймеру. Но делали округление. С выборкой из таблицы.
    Еще можно через множитель и частоту шины определить. Для этого по флагом определяется тип процессора. И далее в зависимости от процессора.

    БИОС, чего только не использует.
     
  14. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    leo
    неверно определяет
     
  15. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    SMBIOS то что нужно, не понял тока как его в protected mode использовать, при попытке чтения 000F0000 - 000FFFFF - BSOD :dntknw: в GDT штоль лезть надо?
     
  16. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    0x000F0000 - 0x000FFFFF физические адреса, а у тебя они интерпретируются (скорее всего) как виртуальные, что приводит к #PF
     
  17. mr_Infern0

    mr_Infern0 New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2007
    Сообщения:
    52
    rei3er
    И чё нужно делать, чтоб из физической памяти читать?
     
  18. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    mr_Infern0
    Ремап сделать, что же еще... :)
     
  19. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Ustus
    <Sleep отпускает процессор и с большой вероятностью вгоняет его в hlt, а современные звери в простое >

    Вообще то просто отключает поток от планировщика на время указанное в параметре.
    Вот код, считающий такты процессора, запускать в КМ.

    Код (Text):
    1.  DWORD  GetCPUClock()   // возможность измерить частоту до 4 Ггц
    2.  {
    3.    DWORD T_eax_;
    4.    DWORD T_edx_;
    5.    _asm
    6.         {
    7.            pushad
    8.            pushfd
    9.                    cli       // застопорить прерывания
    10.  
    11.             mov al,0x0b
    12.             out 0x70,al
    13.             in al,0x71
    14.             mov bl,al
    15.             mov al,0x0b
    16.             out 0x70,al
    17.             mov al,bl
    18.             or al,00000100b  //время в бинарном формате
    19.             out 0x71,al
    20.  
    21. _R_:
    22.             mov al,0
    23.             out 0x70,al
    24.             in al,0x71
    25.             cmp al,0x38     // не более 58 секунд
    26.             jge _R_       // если больше или равняется, то ждать нуля
    27.             mov bl,al      
    28. __T:
    29.             mov al,0
    30.             out 0x70,al
    31.             in al,0x71
    32.             cmp al,bl
    33.             jle __T
    34.             mov bl,al
    35.                           // начало чистой секунды
    36.             rdtsc         // считали текущее состояние счётчика тактов
    37.             mov dword ptr T_eax_,eax
    38.             mov dword ptr T_edx_,edx
    39.  
    40. __RR:
    41.             mov al,0
    42.             out 0x70,al
    43.             in al,0x71
    44.             cmp al,bl
    45.             je __RR
    46.  
    47.             rdtsc          // новое значение счётчика тактов
    48.                            // теперь подсчитываем такты процессора 
    49.             sti
    50.  
    51.             sub eax, T_eax_
    52.             sub edx, T_edx_
    53.  
    54.             add eax,edx
    55.             mov dword ptr T_eax_,eax
    56.  
    57.             mov al,0x0b
    58.             out 0x70,al
    59.             in al,0x71
    60.             mov bl,al
    61.             mov al,0x0b
    62.             out 0x70,al
    63.             mov al,bl
    64.             and al,11111011b // выдавать время в формате  BCD
    65.             out 0x71,al
    66.  
    67.             popfd
    68.             popad
    69.  
    70.         }
    71.        return T_eax_;  // наиточнейшая частота процессора
    72.  }
     
  20. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    mr_Infern0
    <И чё нужно делать, чтоб из физической памяти читать?>

    Эти адреса уже промаплены. Тебе просто нужно найти их.