Q: rtdsc clock

Я извиняюсь, а как совместимым образом узнать, на какой частоте TSC clock работает?

Ну то есть на винде я вовсе QueryPerformanceCounter/QueryPerformanceFrequency использую, а как быть на Linux/Mac?

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/DeveloperTools/Conceptual/SharkUserGuide/AdvancedHardwareCounterConfiguration/AdvancedHardwareCounterConfiguration.html

Полет твоей мысли от меня ускользает

правильный путь снятия метрик -- использование аппаратных pmc счетчиков.
доступ к оным есть на винде и freebsd. для линуха скорее всего тоже есть.
по ссылке про оные на mac os (по крайне мере как исходная точка).

Померять, используя sleep(), gettimeofday() в цикле с усреднением и отбрасыванием...

Ну онанизм же.

Вы хотите сказать, что ОС так и поступает, а сам процессор не знает, какая у него там частота?

нет, но при чём тут ОС? tsc без участи оси и работает, и юзеру отдаётся.
ей он вообще неинтересен.

Ну.
Вот я и хочу узнать частоту. Хотя бы там, где она постоянна.

распарсить /proc/cpuinfo ?

это же часть ОС, верно?

У процессора никак нельзя спросить?

ну так я способ опроса процессора и описал :)

ну откуда же ему знать?
ему на вход какую-то частоту подали, в регистры pll
множитель с делителем прописали и работай, мужичина!

о частоте только мать с биосом знать могут.

clock_gettime(CLOCL_MONOTONIC, ..) & clock_getres - аналогично винде, только результат clock_gettime не нужно делить на результат clock_getres

Ага, спасибо.
Судя по man - то что надо.

я правильно вас понял, что clock_getres выдаст нам период в наносекундах?

"The function clock_getres() finds the resolution (precision) of the specified clock"

вопрос-то был, как узнать частоту (период) получаемого счётчика.
из мана это как-то не очень понятно.

Согласно ману, clock_gettime дает сразу в секундах-наносекундах, делить-умножать не надо.

а толку-то? это только единицы, в которых время отдаётся,
это ещё не значит, что там реально наносекунды.
так можно и 100-герцовый таймер отдать, пересчитав в фемтосекунды, например.

Ну и resolution info - тоже в секундах-наносекундах.

Вот на первой попавшейся под руку FreeBSD-шной машине - говорит что 103nsec разрешение (~10Mhz). Что, конечно, довольно удивительно т.к. ядро рассказывает о 14-Mhz HPET-таймере и 3.6Mhz ACPI-таймере.

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

вот тут и надо измерить для проверки.

а вот что делать будете, если процессор частоту занижает для экономии? TSC тоже должен поплыть...

Согласно википедии, в современных процессорах (начиная с Core2 примерно) - оно не плавает.

Т.к. мне надо для внутрениих тестов, а у меня младше Core2 и нету ничего - то вроде все нормально.

Если мы даже огранимся 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 на секунду времени.

Как-то так