Q: rtdsc clock
lexa - 07/Апр/2012 16:39
Я извиняюсь, а как совместимым образом узнать, на какой частоте TSC clock работает?
Ну то есть на винде я вовсе QueryPerformanceCounter/QueryPerformanceFrequency использую, а как быть на Linux/Mac?
Я извиняюсь, а как совместимым образом узнать, на какой частоте TSC clock работает?
Ну то есть на винде я вовсе QueryPerformanceCounter/QueryPerformanceFrequency использую, а как быть на Linux/Mac?
(C)opyright 2006-2024, Alex Tutubalin, lexa@lexa.ru
Comments
ну во-первых на некоторых процессорах этот клок может плават
ну во-первых на некоторых процессорах этот клок может плавать.
во вторых это даже может быть так:
Calibrating TSC clock ... TSC clock: 800049446 Hz
CPU: Intel(R) Pentium(R) M processor 1.73GHz (800.05-MHz 686-class CPU)
на freebsd -- sysctl machdep.tsc_freq
На современных процессорах вроде не плавает, залечили, если
На современных процессорах вроде не плавает, залечили, если верить википедии.
Но неужто сам процессор этого не может сказать?
можна подумать старые декретом ликвидировали. я вот с чего т
можна подумать старые декретом ликвидировали.
я вот с чего тебе пишу?
А я вот вообще задумался о жизни: на несколькоядерном процес
А я вот вообще задумался о жизни: на несколькоядерном процессоре или там на SMP оно же не факт что синхронно тикает?
это опять таки от модели зависит, но да, в общем случае -- н
это опять таки от модели зависит, но да, в общем случае -- не синхонно.
а нафига такие мучения?
мне-то нужны были наносекундные задержки, а тебе зачем?
Ну это какбэ дешевый таймер с хорошим разрешением (микросеку
Ну это какбэ дешевый таймер с хорошим разрешением (микросекунды мне хватает, конечно) и низким оверхедом.
Но мне удобнее медитировать в микросекундах, а не в абстрактных попугаях
но опять же -- зачем? и разрешение и упор на оверхеде
но опять же -- зачем?
и разрешение и упор на оверхеде
Затем, что в микробенчмарках, которыми я тут занимаюсь, поле
Затем, что в микробенчмарках, которыми я тут занимаюсь, полезно и разрешение и низкий оверхед.
И мне хотелось бы их иметь и на маке тоже. В частности, по той причине, что относительно слабые машины у меня в доме - именно маки.
developer.apple.com/library/mac/#documentation/DeveloperTool
developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/SharkUserGuide/AdvancedHardwareCounterConfiguration/AdvancedHardwareCounterConfiguration.html
Полет твоей мысли от меня ускользает
Полет твоей мысли от меня ускользает
правильный путь снятия метрик -- использование аппаратных pm
правильный путь снятия метрик -- использование аппаратных pmc счетчиков.
доступ к оным есть на винде и freebsd. для линуха скорее всего тоже есть.
по ссылке про оные на mac os (по крайне мере как исходная точка).
Померять, используя sleep(), gettimeofday() в цикле с усредн
Померять, используя sleep(), gettimeofday() в цикле с усреднением и отбрасыванием...
Ну онанизм же. Вы хотите сказать, что ОС так и поступает, а
Ну онанизм же.
Вы хотите сказать, что ОС так и поступает, а сам процессор не знает, какая у него там частота?
нет, но при чём тут ОС? tsc без участи оси и работает, и юзе
нет, но при чём тут ОС? tsc без участи оси и работает, и юзеру отдаётся.
ей он вообще неинтересен.
Ну. Вот я и хочу узнать частоту. Хотя бы там, где она постоя
Ну.
Вот я и хочу узнать частоту. Хотя бы там, где она постоянна.
распарсить /proc/cpuinfo ?
распарсить /proc/cpuinfo ?
это же часть ОС, верно? У процессора никак нельзя спросить?
это же часть ОС, верно?
У процессора никак нельзя спросить?
ну так я способ опроса процессора и описал :) ну откуда же
ну так я способ опроса процессора и описал :)
ну откуда же ему знать?
ему на вход какую-то частоту подали, в регистры pll
множитель с делителем прописали и работай, мужичина!
о частоте только мать с биосом знать могут.
clock_gettime(CLOCL_MONOTONIC, ..) & clock_getres - аналогич
clock_gettime(CLOCL_MONOTONIC, ..) & clock_getres - аналогично винде, только результат clock_gettime не нужно делить на результат clock_getres
Ага, спасибо. Судя по man - то что надо.
Ага, спасибо.
Судя по man - то что надо.
я правильно вас понял, что clock_getres выдаст нам период в
я правильно вас понял, что clock_getres выдаст нам период в наносекундах?
"The function clock_getres() finds the resolution (precision) of the specified clock"
вопрос-то был, как узнать частоту (период) получаемого счётчика.
из мана это как-то не очень понятно.
Согласно ману, clock_gettime дает сразу в секундах-наносекун
Согласно ману, clock_gettime дает сразу в секундах-наносекундах, делить-умножать не надо.
а толку-то? это только единицы, в которых время отдаётся, эт
а толку-то? это только единицы, в которых время отдаётся,
это ещё не значит, что там реально наносекунды.
так можно и 100-герцовый таймер отдать, пересчитав в фемтосекунды, например.
Ну и resolution info - тоже в секундах-наносекундах. Вот н
Ну и resolution info - тоже в секундах-наносекундах.
Вот на первой попавшейся под руку FreeBSD-шной машине - говорит что 103nsec разрешение (~10Mhz). Что, конечно, довольно удивительно т.к. ядро рассказывает о 14-Mhz HPET-таймере и 3.6Mhz ACPI-таймере.
ну вот это может быть как раз тот самый случай, который вы х
ну вот это может быть как раз тот самый случай,
который вы хотели - вам отдают не счётчик прерываний таймера,
а какой-нибудь TSC с разрешением намного выше таймерного.
вот тут и надо измерить для проверки.
а вот что делать будете, если процессор частоту занижает для экономии? TSC тоже должен поплыть...
Согласно википедии, в современных процессорах (начиная с Cor
Согласно википедии, в современных процессорах (начиная с Core2 примерно) - оно не плавает.
Т.к. мне надо для внутрениих тестов, а у меня младше Core2 и нету ничего - то вроде все нормально.
Если мы даже огранимся x86, то есть процессоры с стабильной
Если мы даже огранимся x86, то есть процессоры с стабильной частотой, с нестабильной и с константной (частота нестабильная, но процессор делает вид что стабильная, потому TSC может прыгать). А еще TSC может расходиться между cores, хотя в новых процессорах это уже починили
Лезть в это нет никакого смысла, кернел уже позаботился и засунул все в CLOCK_MONOTONIC
Да, уже посоветовали комментом выше. Похоже, это оно самое и
Да, уже посоветовали комментом выше. Похоже, это оно самое и есть.
Хм
$ cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc
Значит-ли это, что если в /sys/devices/system/clocksource/clocksource0/available_clocksource просматривается hpet, лучше его и использовать?
Для бенчмарков удобно
Для бенчмарков удобно http://doc.trolltech.com/main-snapshot/qtestlib-tutorial5.html . Если тест быстро выполнился он его в цикле покрутит. Ну и мультиплатформ опять же.
Можно и самому провести
Можно и самому провести калибрацию на старте. Провести пару сотен цыклов замерить их с rtdsc, посмотреть чтобы дисперсия была вменяемая, потом сумму разниц rtdsc поделить на время полученное от обычного таймера. И вот - количество тиков rtdsc на секунду времени.
Как-то так