Тактовая частота

Тема в разделе "Другие", создана пользователем kagor, 14 ноя 2003.

Статус темы:
Закрыта.
  1. kagor

    kagor Гость

    Как узнать текущею частоту проца, и сведения о нем, при помощи Си или асма?
     
  2. ????

    ???? Гость

    Если надо, то могу выслать курсач (делал для одного парня), он на VC++ 6.0 MFC под Win. Только мыло укажи.
    Вот кусочек про тактовую частоту:

    Что касается вычисления тактовой частоты процессора, то существуют несколько способов.
    Первый основывается на том факте, что некоторые инструкции выполняются строго определенное количество машинных тактов. Обычно такая методика применяется на 386 и 486 процессорах. Например, инструкция Bit Scan Forward (BSF) выполняется одинаковое количество тактов на процессорах 386, 486 и Pentium, так что выполнение этой инструкции несколько раз в цикле даст нам известный промежуток времени, из которого может быть вычислена тактовая частота процессора. Пример такого цикла показан в следующем фрагменте:

    Код (Text):
       mov eax, 80000000h
      mov ebx, 10000
    LOOP: bsf ecx,eax
      dec ebx
      jnz LOOP
    Этот фрагмент кода выполняется соответственно 115, 47 и 43 такта на процессорах Intel 386, 486 и Pentium. На процессорах семейства Pentium Pro надежность алгоритма падает из-за особенностей архитектуры (динамическое выполнение и распределение ресурсов) и каждый цикл выполняется приблизительно 3.3 машинных такта. Для увеличения надежности метода нужно увеличить количество итераций. После определения количества тактов, необходимых для выполнения итераций, задача вычисления тактовой частоты процессора становится тривиальной.

    Второй способ – использование инструкции RDTSC. Измерение скорости процессора, который поддерживает инструкцию RDTSC намного проще, чем у процессора, который ее не поддерживает. Для этого нужен высокопроизводительный таймер с известной частотой. Вы запускаете оба таймера на определенное время. Отсюда может быть вычислена частота таймера RDTSC.
    Далее приведен псевдо-код, который выполняет 1000 циклов счетчика, из чего затем определяется частота, на которой работает процессор:

    Код (Text):
    T_start = T_end = Значение второго высокопроизводительного таймера
    RDTSC_start = Значение инструкции RDTSC
    while (T_start - T_end <1000)
    {
      T_end = Значение второго высокопроизводительного таймера
    }
    RDTSC_end = Значение инструкции RDTSC
    RDTSC_elapsed = RDTSC_end – RDTSC_start;
    T_elapsed = T_end – T_start;
    Далее частота процессора может быть вычислена о следующей формуле:

    Real time = (1/Частота второго высокопроизводительного таймера) * T_elapsed
    Clock speed = RDTSC_elapsed / Real Time


    Для определения другой информации о процессоре используется инструкция CPUID
     
  3. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    2 kagor

    Если у тебя NT система, то много сведений тянется из реестра. Причем для каждого процессора отдельно (если мультипроцессорная система).
     
  4. kagor

    kagor Гость

    2 ????: kagor@pochta.ru
    2 Серёга : Откуда именно тянется (система однопроцессорная)
     
  5. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    2kagor

    HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System
     
  6. ????

    ???? Гость

    Еще, для определения информации о процессоре можно использовать WMI (по крайней мере я на это надеюсь) - правдо не знаю как :D :unsure:
    Если узнаю, напишу. Узнает кто-либо другой - напишите тоже.

    P.S. Еще можешь посмотреть http://www.rsdn.ru/Forum/?mid=226604
     
  7. ????

    ???? Гость

    Вот что-то по WMI нашел. А что это не знаю (надеюсь пока) :unsure: :D

    Win32_Processor

    The Win32_Processor WMI class represents a device that can interpret a sequence of machine instructions on a computer running a Windows® operating system. On a multiprocessor machine, one instance of the Win32_Processor class exists for each processor.

    Код (Text):
    On Error Resume Next
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_Processor",,48)
    For Each objItem in colItems
     Wscript.Echo "AddressWidth: " & objItem.AddressWidth
     Wscript.Echo "Architecture: " & objItem.Architecture
     Wscript.Echo "Availability: " & objItem.Availability
     Wscript.Echo "Caption: " & objItem.Caption
     Wscript.Echo "ConfigManagerErrorCode: " & objItem.ConfigManagerErrorCode
     Wscript.Echo "ConfigManagerUserConfig: " & objItem.ConfigManagerUserConfig
     Wscript.Echo "CpuStatus: " & objItem.CpuStatus
     Wscript.Echo "CreationClassName: " & objItem.CreationClassName
     Wscript.Echo "CurrentClockSpeed: " & objItem.CurrentClockSpeed
     Wscript.Echo "CurrentVoltage: " & objItem.CurrentVoltage
     Wscript.Echo "DataWidth: " & objItem.DataWidth
     Wscript.Echo "Description: " & objItem.Description
     Wscript.Echo "DeviceID: " & objItem.DeviceID
     Wscript.Echo "ErrorCleared: " & objItem.ErrorCleared
     Wscript.Echo "ErrorDescription: " & objItem.ErrorDescription
     Wscript.Echo "ExtClock: " & objItem.ExtClock
     Wscript.Echo "Family: " & objItem.Family
     Wscript.Echo "InstallDate: " & objItem.InstallDate
     Wscript.Echo "L2CacheSize: " & objItem.L2CacheSize
     Wscript.Echo "L2CacheSpeed: " & objItem.L2CacheSpeed
     Wscript.Echo "LastErrorCode: " & objItem.LastErrorCode
     Wscript.Echo "Level: " & objItem.Level
     Wscript.Echo "LoadPercentage: " & objItem.LoadPercentage
     Wscript.Echo "Manufacturer: " & objItem.Manufacturer
     Wscript.Echo "MaxClockSpeed: " & objItem.MaxClockSpeed
     Wscript.Echo "Name: " & objItem.Name
     Wscript.Echo "OtherFamilyDescription: " & objItem.OtherFamilyDescription
     Wscript.Echo "PNPDeviceID: " & objItem.PNPDeviceID
     Wscript.Echo "PowerManagementCapabilities: " & objItem.PowerManagementCapabilities
     Wscript.Echo "PowerManagementSupported: " & objItem.PowerManagementSupported
     Wscript.Echo "ProcessorId: " & objItem.ProcessorId
     Wscript.Echo "ProcessorType: " & objItem.ProcessorType
     Wscript.Echo "Revision: " & objItem.Revision
     Wscript.Echo "Role: " & objItem.Role
     Wscript.Echo "SocketDesignation: " & objItem.SocketDesignation
     Wscript.Echo "Status: " & objItem.Status
     Wscript.Echo "StatusInfo: " & objItem.StatusInfo
     Wscript.Echo "Stepping: " & objItem.Stepping
     Wscript.Echo "SystemCreationClassName: " & objItem.SystemCreationClassName
     Wscript.Echo "SystemName: " & objItem.SystemName
     Wscript.Echo "UniqueId: " & objItem.UniqueId
     Wscript.Echo "UpgradeMethod: " & objItem.UpgradeMethod
     Wscript.Echo "Version: " & objItem.Version
     Wscript.Echo "VoltageCaps: " & objItem.VoltageCaps
    Next
     
  8. kagor

    kagor Гость

    2:????
    Спасибо за курсач, там есть все, что мне нужно, даже больше. :D
     
  9. kagor

    kagor Гость

    2:????
    Попробовал WMI, думаю, мне он не подходит, лучше Си и Асма нет ничего:D
     
  10. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    kagor
    Я бы не сказал. А асмом в NT системах бывает туговато. А WMI многое решает.
     
  11. kagor

    kagor Гость

    2 Серёга
    Да с асмом бывает туговато, а жаль:D
     
  12. ????

    ???? Гость

    Серёга
    kagor

    С асмом не должно быть туговато нигде :)
    Его юзают везде - и в 9x и в NT. И для NT писать на нем чуть-чуть легче, т.к. если лажанулся - NT зарубит ошибку, а 9x - зарубит сама себя. :)
     
  13. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    ????
    А как же прямой доступ к железу?
     
  14. ????

    ???? Гость

    Драйвер! Или сторонние библиотеки (например io.sys).
    А то, что под 98 можно напрямую работать с железом - это глюк системы (защиты), которую используют как особенность :)
     
  15. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    ????
    Это как посмотреть. При прямом доступе ты не зависишь от чьих-то библиотек и драйверов.
     
  16. kagor

    kagor Гость

    ????
    Серёга

    По-моему енто уже на флейм смахивает :)
     
  17. ????

    ???? Гость

    Ну так пиши драйвер (наслаждайся BSOD :) ) где используй прямой доступ к портам или через HAL.
     
  18. ????

    ???? Гость

    kagor
    Ну мы еще чуть-чуть пофлеймим и успокоемся :)
    А если хочешь (ты же все-таки создатель вевти), можем тему закрыть :)
     
  19. admin

    admin Well-Known Member

    Регистрация:
    8 авг 2003
    Сообщения:
    2.811
    Симпатии:
    0
    kagor
    Ладно. Закрыли тему :)
     
Статус темы:
Закрыта.

Поделиться этой страницей