Как узнать частоту процессора c

Обновлено: 06.07.2024

Я пытаюсь получить ТЕКУЩУЮ тактовую частоту процессора (не использование, базовое, мин. / Макс.). Я пробовал использовать ManagementObjects, но «CurrentClockSpeed» всегда дает фиксированное значение 3400 или 3,4 ГГц, что является максимальной стандартной скоростью процессора. Я пробовал много раз, и это дает мне тот же ответ, так что я думаю, это не просто совпадение.

Возможно, это наивный вопрос, но почему, помимо разгона, может измениться скорость процессора? «Скорость» - это сколько вычислений выполняется за время может, верно? Все остальное - это утилизация, которая вас не интересует.

Не беспокойтесь, все это немного запутанно! Я думаю, что, когда вы говорите о «скорости», вы могли бы подумать, это то, что мы могли бы назвать нашей максимальной тактовой частотой (которую производители предоставляют при покупке процессора). Эта скорость просто говорит нам о максимальной (если не разогнанной) скорости, на которой он должен работать, и о том, с какой скоростью вы должны ожидать, что он будет работать. Но я ищу текущую тактовую частоту. Это просто говорит нам значение в ГГц, на котором процессор обменивается данными. Ваша тактовая частота всегда повышается и понижается в зависимости от загрузки процессора, потому что не всегда нужно работать на 100%.

CurrentClockSpeed ​​кажется правильным свойством. Мой варьируется от 2900 до 2901 на этом процессоре, который я сейчас использую. Вы уверены, что ваш показатель должен быть ниже?

Хммм, а у вас случайно есть код? Я очень уверен. Я запускал его в разных вариантах и ​​основывал на диспетчере задач. Он просто возвращает базовое значение, несмотря ни на что, даже если текущая скорость намного ниже.

@Corak why would the speed of the CPU change? по ряду причин. Например, современные процессоры автоматически дросселируются при обнаружении перегрева в качестве средства защиты. ОС также может запросить работу процессора на пониженной тактовой частоте для экономии энергии.

Вы вообще не пробовали напрягать ЦП? Откройте несколько интенсивных программ и дайте им посидеть несколько минут, а затем попробуйте очистить + перестроить + запустить программу. Сообщите нам, если номер остался прежним.

Я использую совершенно другой код, и он мне подходит, но ваш тоже должен работать нормально. Может быть, ваш процессор всегда работает на максимальной мощности?

Не могли бы вы предоставить код? Хотелось бы посмотреть, как устроена ваша по сравнению с моей. Я проверял текущую тактовую частоту во время тестов, и в большинстве случаев она не работала близко к максимальной тактовой частоте.

@ user9622460 - Я думаю, вам нужно повторно создать экземпляр ManagementObject между чтениями. Попробуйте сделать следующее и посмотрите, получится ли у вас другие показания: for (int i = 0; i < 10; i++) < using (var mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'")) < var sp = (uint)(mo["CurrentClockSpeed"]); Console.WriteLine(sp); >System.Threading.Thread.Sleep(1000); > - и да, позвольте процессору чем-нибудь заняться между чтениями.

@ user9622460 Просто тестирую с Создатель кода WMI.

@Corak, поэтому я попробовал этот метод и получил другой результат, но это только сбивает с толку. При этом я держал диспетчер задач, чтобы посмотреть, насколько он был близок, и, как обычно, он не был близок. Единственные изменения, которые он внес, - это 2400. Это очень странно и заставляет меня думать, что это все еще не работает. Если вы знаете процессоры, они довольно быстро меняются взад и вперед, и, как правило, они не округляются до заданного числа снова и снова. У любого, у кого это работает, есть код, который я могу проверить?

Выясните, что значение 2400 - это минимальное значение.

Так кто-нибудь нашел ответ на мою проблему? Я обнаружил проблему с настройкой значения часов, но все еще не уверен, почему оно неточно?

Я пытаюсь выяснить, есть ли в любом случае, чтобы получить представление о частоте процессора системы, в которой работает мой код C.

чтобы уточнить, я ищу абстрактное решение (которое не будет привязано к определенной архитектуре или ОС), которое может дать мне представление о рабочей частоте компьютера, на котором выполняется мой код. Мне не нужно быть точным, но я хотел бы быть в парке (т. е. У меня есть процессор 2.2 GHz, я хотел бы иметь возможность сказать в своей программе, что Я в пределах нескольких сотен МГц от этого)

есть ли у кого-нибудь идея использовать стандартный код C?

Как найти частоту процессора архитектуры и зависимые ОС, и нет абстрактных решений.

Если бы мы были 20+ лет назад, и вы использовали ОС без переключения контекста, и процессор выполнил инструкции, данные ему по порядку, вы могли бы написать некоторый код C в цикле и времени, а затем на основе сборки он был скомпилирован в вычислить количество инструкций во время выполнения. Это уже делает предположение, что каждая инструкция занимает 1 такт, который это довольно плохое предположение с тех пор, как конвейерные процессоры.

но любая современная ОС будет переключаться между несколькими процессами. Даже тогда, вы можете попытаться время кучу одинаковых for цикл выполняется (игнорируя время, необходимое для ошибок страницы и нескольких других причин, по которым ваш процессор может остановиться) и получить медианное значение.

и даже если предыдущее решение работает, у вас есть многоэтапные процессоры. С любым современным процессором это честная игра, чтобы переупорядочить ваши инструкции, выпускайте их в одном такте или даже разделяйте на ядра.

чтобы сделать это, вы сначала делаете то, что делаете 20 лет назад. Вы пишете некоторый код с циклом, где вы знаете задержку и время ее. Вот что я использовал:

это имеет зависимость от цикла переноса, поэтому процессор не может изменить порядок, чтобы уменьшить задержку. Это всегда занимает 3 часа циклы за итерацию. ОС не будет переносить поток в другое ядро, потому что мы свяжем потоки.

затем вы запускаете эту функцию на каждом физическом ядре. Я сделал это с OpenMP. Нити должны быть связаны для этого. В linux с GCC вы можете использовать export OMP_PROC_BIND=true чтобы связать потоки и предполагая, что у вас есть ncores физическое ядро также export OMP_NUM_THREADS=ncores . Если вы хотите программно связать и найти количество физических ядер для процессоров Intel, см. Это программно-определить число физических процессоров-ядер-или-если-многопоточность и thread-affinity-with-windows-msvc-and-openmp.

наконец запустите пробоотборник в цикле и распечатайте результаты

для полноты уже существует простое, быстрое, точное решение для пользовательского режима с огромным недостатком: оно работает только на процессорах Intel Skylake, Kabylake и более новых. Точное требование-поддержка уровня CPUID 16h. Согласно руководству разработчика программного обеспечения Intel 325462 release 59, страница 770:

Как узнать частоту процессора

От тактовой частоты процессора сильно зависит производительность и скорость работы системы. Данный показатель не является постоянным и может незначительно изменяться в ходе работы компьютера. При желании, процессор также можно «разогнать», тем самым увеличив частоту.

Узнать тактовую частоту можно как стандартными способами, так и при помощи стороннего ПО (последнее даёт более точный результат).

Основные понятия

Стоит помнить, что тактовая частота процессора измеряется в герцах, но обычно указывается либо в мегагерцах (МГц), либо в гигагерцах (ГГц).

Также стоит помнить, что если вы будете пользоваться стандартными способами проверки частоты, то нигде не встретите такого слова как «частота». Скорее всего вы увидите следующее (пример) – «Intel Core i5-6400 3,2 GHz». Разберём по порядку:

Частоту можно посмотреть в документации к аппарату. Но данные там могут несколько отличаться от реальных, т.к. в документах написано среднее значение. А если до этого с процессором производились какие-либо манипуляции, то данные могут разительно отличаться, поэтому рекомендуется получать информацию только программными средствами.

Способ 1: AIDA64

AIDA64 – функциональная программа для работы с компонентами компьютера. ПО платное, но есть демонстрационный период. Для того, чтобы просмотреть данные о процессоре в реальном времени будет вполне достаточно и её. Интерфейс полностью переведён на русский язык.

Инструкция выглядит так:

  1. В главном окне перейдите в пункт «Компьютер». Сделать это можно как через центральное окно, так и через левое меню.
  2. Аналогично перейдите в «Разгон».

AIDA64 интерфейс

Частота в AIDA64

Способ 2: CPU-Z

CPU-Z – программа с лёгким и понятным интерфейсом, которая позволяет просмотреть более детально все характеристики компьютера (в том числе процессора). Распространяется бесплатно.

Чтобы увидеть частоту, просто откройте программу и в главном окне обратите внимание на строчку «Specification». Там будет написано наименование процессора и в самом конце указана актуальная частота в ГГц.

Частота в CPU-Z

Способ 3: BIOS

Если вы ни разу не видели интерфейс БИОСа и не знаете, как там работать, то лучше оставить данный способ. Инструкция выглядит следующим образом:

  1. Для входа в меню BIOS нужно перезагрузить компьютер. До того момента, как появится логотип Windows нажмите клавишу Del или клавиши от F2 до F12 (нужная клавиша зависит от спецификаций компьютера).
  2. В разделе «Main» (открывается по умолчанию сразу же при входе в BIOS), найдите строку «Processor Type», где будет указано наименование производителя, модели и в конце текущая частота.

Способ 4: Стандартные средства системы

Самый лёгкий способ из всех, т.к. не требует установки дополнительного ПО и входа в БИОС. Узнаём частоту стандартными средствами Windows:

  1. Перейдите в «Мой компьютер».
  2. Нажмите правую кнопку мыши в любом свободном месте и перейдите в «Свойства». Вместо этого можно также нажать ПКМ по кнопке «Пуск» и выбрать в меню «Система» (в этом случае переходить в «Мой компьютер» не нужно).

Меню

Узнать текущую частоту очень просто. В современных процессорах этот показатель уже не является самым главным фактором в плане производительности.

Закрыть

Мы рады, что смогли помочь Вам в решении проблемы.

Отблагодарите автора, поделитесь статьей в социальных сетях.

Закрыть

Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.

Я пытаюсь измерить скорость процессора, но не уверен, насколько точен мой метод. По сути, я пробовал пустой цикл for со значениями вроде UINT_MAX , но программа быстро завершалась, поэтому я попробовал UINT_MAX * 3 и так далее .

Затем я понял, что компилятор оптимизирует цикл, поэтому я добавил переменную volatile , чтобы предотвратить оптимизацию. Следующая программа длится примерно 1,5 секунды. Я хочу знать, насколько точен этот алгоритм измерения тактовой частоты. Кроме того, как мне узнать, сколько ядер задействовано в процессе?

2 ответа

Он вообще не измеряет тактовую частоту, он измеряет, сколько итераций цикла может быть выполнено в секунду. Нет правила, согласно которому за такт будет выполняться одна итерация. Это может иметь место, и вы, возможно, действительно обнаружили, что это так - конечно, с оптимизированным кодом и разумным ЦП бесполезный цикл не должен работать намного медленнее, чем это. Однако он может работать на половинной скорости, некоторые процессоры не могут отключать более 1 взятой ветви каждые 2 цикла. А на эзотерические цели все ставки отключены.

Так что нет, это не измеряет тактовые циклы, кроме как случайно. В общем, очень сложно получить эмпирическую тактовую частоту (вы можете спросить свою ОС, какие, по ее мнению, максимальная тактовая частота и текущая тактовая частота, см. Ниже), потому что

Если вы измеряете, сколько времени занимает цикл, вы должны знать (хотя бы приблизительно) количество циклов на итерацию. Это достаточно серьезная проблема в сборке, требующая довольно подробных знаний ожидаемых микроархитектур (может быть, длинная цепочка зависимых инструкций, каждая из которых может занимать только 1 цикл, например add eax, 1 - достаточно длинная цепочка, которая различается в тесте / пропускная способность ветви становится достаточно маленькой, чтобы ее можно было игнорировать), поэтому очевидно, что все, что вы там делаете, непереносимо и будет иметь встроенные предположения, может стать ложным (на самом деле есть другой ответ на SO, который делает это и предполагает, что addps имеет латентность 3, чего больше нет на Skylake и не было на старых AMD). В C? Сдавайся сейчас же. Компилятор может запускать какой-нибудь генератор случайного кода, и полагаться на его разумность - все равно что делать то же самое с медведем. Угадывать количество циклов на итерацию кода, который вы не контролируете и даже не знаете , - просто глупость. Если это просто на вашем компьютере, вы можете проверить код, но тогда вы можете просто проверить тактовую частоту вручную, так что ..Can't load full resultsTry againRetrying. Retrying.

Если вы измеряете количество тактов, прошедших за заданное время настенных часов . но это сложно. Потому что rdtsc не измеряет тактовые циклы (больше нет), и ничто другое не приближается. Вы можете измерить что-то , но с масштабированием частоты и турбо, как правило, это не будет фактических тактовых циклов. Вы можете получить фактические тактовые циклы из счетчика производительности, но не можете сделать это в пользовательском режиме. Очевидно, что любой способ сделать это непереносим, потому что вы не можете переносимо запросить количество прошедших тактовых циклов.

Так что, если вы делаете это для получения актуальной информации, а не просто для того, чтобы возиться, вам, вероятно, следует просто спросить ОС. Для Windows запросите WMI для CurrentClockSpeed или MaxClockSpeed, в зависимости от того, что вы хотите. В Linux есть вещи в /proc/cpuinfo . По-прежнему не портативный, но тогда и решения нет.

как узнать, сколько ядер задействовано в процессе?

1. Конечно, ваш поток может перемещаться между ядрами, но поскольку у вас есть только один поток, он может быть только на одном ядре в любое время.

Хороший оптимизатор может удалить цикл, поскольку

Оказывает такое же влияние на состояние программы, как и;

Таким образом, оптимизатор может полностью освободить ваш цикл.

Таким образом, вы не можете измерить скорость процессора таким образом, поскольку она зависит от компилятора так же, как и от компьютера (не говоря уже о переменной тактовой частоте и уже упомянутой многоядерной архитектуре)

Читайте также: