Вопрос 1: Есть ли у ЦП или ГП какой-либо другой способ оценки времени, кроме подсчета циклов?
Разное оборудование может предоставлять разные возможности. Например, ПК с архитектурой x86 использовали несколько аппаратных средств для синхронизации: за последнее десятилетие или около того процессоры с архитектурой x86 имеют Time Stamp. Счетчики работают на своей частоте обработки или, в последнее время, на некоторой фиксированной частоте (постоянная скорость, также известная как инвариантный TSC); там может быть таймер событий высокой точности, и, если вернуться назад, были программируемые таймеры прерывания (https://en.wikipedia.org/wiki/Programmable_interval_timer).
Если это так, то, поскольку способ счета циклов компьютера никогда не будет таким точным, как атомные часы, это означает, что секунда (период = std::ratio‹1›) для компьютера может быть на самом деле короче или больше, чем фактическая секунда, вызывая различия в долгосрочном измерении времени между компьютерными часами и, скажем, GPS.
Да, компьютер без атомных часов (сейчас они доступны на чипе) не будет таким точным, как атомные часы. При этом такие службы, как сетевой протокол времени, позволяют поддерживать более тесную согласованность между несколькими компьютерами. . Иногда этому помогает использование методов Pulse Per Second (PPS). Более современные и точные варианты включают протокол точного времени (PTP) (который часто может достигать менее микросекунды). точность по локальной сети).
Вопрос 3: Измеряется ли количество циклов ЦП и ГП в зависимости от аппаратной частоты?
Это зависит. Для TSC более новые реализации TSC с постоянной скоростью не изменяются, другие изменяются.
Если да, то как с этим справляется std::chrono?
Я ожидаю, что большинство реализаций будут вызывать службу времени, предоставляемую ОС, поскольку ОС, как правило, лучше всего знает об оборудовании и имеет доступ к нему. Есть много факторов, которые необходимо учитывать, например. синхронизируются ли показания TSC между ядрами, что произойдет, если ПК перейдет в какой-то спящий режим, какие ограничения памяти желательны вокруг выборки TSC....
Если нет, то чему соответствует цикл (например, каково основное время)?
Для процессоров Intel см. этот ответ.
Есть ли способ получить доступ к преобразованию во время компиляции? Есть ли способ получить доступ к преобразованию во время выполнения?
std::chrono::duration::count
показывает количество тиков для любого используемого источника времени, и вы может duraction_cast
в другие единицы времени (например, секунды). Ожидается, что C++20 представит дополнительные возможности, такие как clock_cast
. Насколько я знаю, constexpr
преобразование недоступно: тоже кажется сомнительным, если программа может в конечном итоге работать на машине с другой скоростью TSC, чем машина, на которой она была скомпилирована.
person
Tony Delroy
schedule
16.06.2018