Прямо от Intel, вот объяснение того, как последние процессоры поддерживают TSC, который тикает с постоянной скоростью, является синхронным между ядрами и пакетами на многоплатформенной материнской плате и может даже продолжать тикать, когда процессор переходит в глубокий сон C-состояние, в частности, увидеть пояснения по Vipin Кумар EK (Intel):
http://software.intel.com/en-us/articles/best-timing-function-for-measuring-ipp-api-timing/
Вот еще одна ссылка от Intel обсуждает синхронизацию TSC через ядер, в этом случае они упоминают о том, что rdtscp позволяет вам читать как TSC, так и идентификатор процессора атомарно, это важно для отслеживания приложений ... предположим, что вы хотите отслеживать выполнение потока, который может мигрировать из одного ядра в другой, если вы делаете это в двух отдельных инструкциях (неатомных), то у вас нет уверенности в том, в каком ядре поток был в то время, когда он читал часы.
http://software.intel.com/en-us/articles/intel-gpa-tip-cannot-sychronize-cpu-timestamps/
Все разъемы/пакеты на материнской плате получают два внешних общих сигналов:
- СБРОС
- Reference ЧАСЫ
Все разъемы см RESET, в то же самое время, когда вам питание материнской платы, все пакеты процессоров получают опорный тактовый сигнал от внешнего кварцевого генератора и внутреннего clo cks в процессоре хранятся в фазе (хотя обычно с большим множителем, например, 25x) с цепью, называемой фазовой блокировкой (PLL). Последние процессоры будут синхронизировать TSC на самой высокой частоте (множителе), которую процессор оценивает (так называемый постоянный TSC), независимо от множителя, который может использовать любое отдельное ядро из-за регулирования температуры или регулирования мощности (так называемый инвариантный TSC).Процессоры Nehalem, такие как X5570, выпущенные в 2008 году (и более новые процессоры Intel), поддерживают «Non-stop TSC», который будет продолжать тикать даже при сохранении мощности в режиме сильного C-состояния (C6). Смотрите эту ссылку для получения дополнительной информации о различных энергетических состояниях вниз:
http://www.anandtech.com/show/2199
После дальнейших исследований я наткнулся на патент Intel, поданный 12/22/2009 и был опубликован на 6/23/2011, озаглавленного «Контроллинг Time Stamp Счетчик (TSC) Отводы для Mulitple ядер и потоков»
http://www.freepatentsonline.com/y2011/0154090.html
страница Google для данной заявки на патент (с ссылкой на USPTO страницы)
http://www.google.com/patents/US20110154090
Из того, что я собираю, есть один TSC в uncore (логика в пакете, окружающем ядра, но не часть любого ядра), который увеличивается на каждый внешний такт шины на значение в поле конкретной машины регистр, указанный Випином Кумаром по ссылке выше (MSR_PLATFORM_INFO [15: 8]). Часы внешней шины работают на частоте 133.33 МГц. Кроме того, каждое ядро имеет свой собственный регистр TSC, синхронизированный тактовой областью, которая разделяется всеми ядрами и может отличаться от часов для любого одного ядра - поэтому должен быть некоторый буфер, когда основной TSC считывается RDTSC (или RDTSCP), работающий в ядре. Например, MSR_PLATFORM_INFO [15: 8] может быть установлен на 25 в пакете, каждый из которых синхронизирует TSC с тем, чтобы не увеличивать TSC на 25, есть PLL, который умножает часы шины на 25 и передает эти часы каждому из сердечников в такт их местный регистр TSC, тем самым синхронизируя все регистры TSC. Таким образом, чтобы отобразить терминологию на имеющемся оборудовании
- Константа ТСК реализуется с помощью внешнего тактового сигнала шины с тактовой частотой 133,33 МГц, который умножается на постоянного множителя, указанного в MSR_PLATFORM_INFO [15: 8]
- Инвариантный ТСК реализован сохраняя TSC в каждом ядре на отдельном тактовом домене
- Бесперебойный TSC реализован путем сохранения TSC, который увеличивается на MSK_PLATFORM_INFO [15: 8] на каждом такте шины, таким образом, многоядерный пакет может перейдите в глубокое энергоснабжение (состояние C6) и можете выключить PLL ... нет необходимости держать часы в более высоком множителе. Когда ядро возобновляется из состояния C6, его внутренний TSC будет инициализирован значением uncore TSC (тот, который не заснул) с коррекцией смещения, если программное обеспечение записало значение для TSC, подробности которые находятся в патенте. Если программное обеспечение не писать в TSC то ТСК для этого сердечника будет вне фазы с другими ядрами, но при постоянном смещении (частота TSC часов все привязана к опорной частоте шины от постоянного множителя).
Вы не можете рассчитывать на clock_gettime() для наносекундной точности, между прочим; это точно только в течение примерно четверти микросекунды. Я столкнулся с этим, когда пытался получить сверхточные тайминги и обнаружил, что gettime() сам стоит больше 250 нс. http://stackoverflow.com/questions/7935518/is-clock-gettime-adequate-for-submicrosecond-timing – Crashworks
Если TSC используется для предоставления отметки времени, он должен отражать только дельта nano секунд. Я использую linux. И я понимаю, что ядро обеспечивает ожидаемую производительность. окна - может и не быть. –
@Crashworks pls прочитали мой последний комментарий по этой теме, которую вы поделили. –