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

  • Автор темы kagor
  • Дата начала
Статус
Закрыто для дальнейших ответов.
K

kagor

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

????

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

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

Код:
   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 циклов счетчика, из чего затем определяется частота, на которой работает процессор:

Код:
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
 

admin

Well-Known Member
08.08.2003
2 754
1
#3
2 kagor

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

kagor

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

????

Гость
#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.

Код:
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
 
K

kagor

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

kagor

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

admin

Well-Known Member
08.08.2003
2 754
1
#10
kagor
Я бы не сказал. А асмом в NT системах бывает туговато. А WMI многое решает.
 
K

kagor

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

????

Гость
#12
Серёга
kagor

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

????

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

admin

Well-Known Member
08.08.2003
2 754
1
#15
????
Это как посмотреть. При прямом доступе ты не зависишь от чьих-то библиотек и драйверов.
 
K

kagor

Гость
#16
????
Серёга

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

????

Гость
#17
При прямом доступе ты не зависишь от чьих-то библиотек и драйверов
Ну так пиши драйвер (наслаждайся BSOD :) ) где используй прямой доступ к портам или через HAL.
 
?

????

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