2012-06-06 2 views
12

В Linux мире, чтобы получить наны секунды точности таймера/clockticks можно использовать:CPU TSC принести работу, особенно в среде многоядерного-многопроцессорной

#include <sys/time.h> 

int foo() 
{ 
    timespec ts; 

    clock_gettime(CLOCK_REALTIME, &ts); 
    //--snip--  
} 

This answer предполагает asm подхода к прямому запросу для тактового с инструкцией RDTSC.

В многоядерной многопроцессорной архитектуре, как синхронизируются эти часы/таймер на нескольких ядрах/процессорах? Мое понимание заключается в том, что там, где делается неотъемлемое фехтование. Правильно ли это понимание?

Можете ли вы предложить документацию, которая подробно объяснила бы это? Меня интересуют микроархитектуры Intel Nehalem и Sandy Bridge.

EDIT

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

Редактировать

Спасибо за подтверждение того, что TSC синхронизируется между ядрами и процессорами. Но мой первоначальный вопрос: как эта синхронизация выполняется? это с каким-то фехтованием? знаете ли вы о какой-либо публичной документации?

Заключение

Спасибо за все входы: Вот вывод для этого обсуждения: TSCS синхронизируется при инициализации с помощью RESET, что происходит между ядрами и процессорами в нескольких многопартийной системе процессора/ядра. И после этого каждое Ядро само по себе. TSC сохраняются в неизменном виде с фазой Locked Loop, которая нормализует частотные вариации и, следовательно, изменения частоты в пределах заданного Core, и именно так TSC остается синхронным по ядрам и процессорам.

+0

Вы не можете рассчитывать на clock_gettime() для наносекундной точности, между прочим; это точно только в течение примерно четверти микросекунды. Я столкнулся с этим, когда пытался получить сверхточные тайминги и обнаружил, что gettime() сам стоит больше 250 нс. http://stackoverflow.com/questions/7935518/is-clock-gettime-adequate-for-submicrosecond-timing – Crashworks

+0

Если TSC используется для предоставления отметки времени, он должен отражать только дельта nano секунд. Я использую linux. И я понимаю, что ядро ​​обеспечивает ожидаемую производительность. окна - может и не быть. –

+0

@Crashworks pls прочитали мой последний комментарий по этой теме, которую вы поделили. –

ответ

12

На новых процессорах (i7 Nehalem + IIRC) TSC синхронизируется по всем ядрам и работает с постоянной скоростью. Так что для одного процессора или нескольких процессоров на одном пакете или на материнской плате (!) Вы можете полагаться на синхронизированный TSC.

От системы Intel Руководство 16.12.1

Метка времени счетчик в новых процессорах может поддерживать усиление, называется инвариантной TSC. Поддержка процессоров для инвариантного TSC равна , указанному CPUID.80000007H: EDX [8]. Инвариантный TSC будет работать с постоянной скоростью во всех ACPI P-, C-. и T-состояния. Это архитектурное поведение .

На старых процессорах вы не можете полагаться ни на постоянную скорость, ни на синхронизацию.

Редактировать: По крайней мере, на нескольких процессорах в одном пакете или на материнской плате синхронизируется инвариантный TSC. TSC сбрасывается до нуля на/RESET, а затем гаснет вперед с постоянной скоростью на каждом процессоре без дрейфа. Сигнал/RESET гарантированно будет поступать на каждый процессор одновременно.

+0

интересная информация. Благодарю. ! –

+1

Обратите внимание, что это относится только к процессорам Intel. Прошло некоторое время с тех пор, как я провел тестирование на AMD (самый последний процессор AMD, который я тестировал, был IIRC, Phenom II), но в то время у них даже не было синхронизации по ядрам в одном кристалле. – user434507

5

RTDSC не синхронизирован между процессорами. Таким образом, вы не можете полагаться на него в многопроцессорных системах. Единственным обходным решением, которое я могу придумать для Linux, было бы фактически ограничить процесс запуском на одном CPU с помощью настроек его близости. Это можно сделать извне, используя утилиту taskset или «внутренне» с использованием функций sched_setaffinity или pthread_setaffinity_np.

5

This manual, глава 17.12, описывает инвариантный TSC, используемый в новейших процессорах. Доступный с Nehalem этот штамп времени вместе с инструкцией rtscp позволяет читать временную метку (не затронутую состояниями ожидания и т. Д.) И сигнатуру процессора в одной атомной операции.

Говорят, что он подходит для расчета времени настенных часов, но, очевидно, он не ожидает, что значение будет одинаковым для всех процессоров. Заявленная идея заключается в том, что вы можете видеть, соответствуют ли последовательные чтения тем же самым часам процессора или настраиваются для чтения нескольких CPU. «Он также может использоваться для настройки различий между процессорами в значениях TSC в системе NUMA».

Смотрите также rdtsc accuracy across CPU cores

Однако, я не уверен, что окончательный вывод о последовательности в принятом ответе следует из утверждения, что ТСК может использоваться для времени настенных часов. Если бы это было согласовано, то какая причина была бы для атомарного определения источника ЦП времени.

N.B. Информация TSC перешла от главы 11 к главе 17 в руководстве Intel.

+0

'Если бы это было согласовано, то какая причина была бы для атомарного определения источника ЦП времени.': Именно этот вопрос я задал как часть этого обсуждения. –

+0

И я говорю, учитывая информацию, содержащуюся в руководстве, что есть веские основания полагать, что время является инвариантным по состояниям процессора, но не по отношению к процессорам. Это похоже на вывод, который делается, но я считаю, что ваша осторожность оправдана. Обратите внимание, что инструкция для чтения подписи cpu также является новой. Я бы также предположил, что если значение tsc задано ядром, его значение (фаза) будет не таким, даже если TSC будут работать по одной и той же схеме синхронизации и, следовательно, заблокировать частоты. –

20

Прямо от 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/

Все разъемы/пакеты на материнской плате получают два внешних общих сигналов:

  1. СБРОС
  2. 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 часов все привязана к опорной частоте шины от постоянного множителя).
+1

Спасибо за ваш ответ. Ваша первая ссылка рассказывает о временной оболочке в библиотеке Intel IPP. IPP - это библиотека обработки изображений. Ссылка просто утверждает тот же факт, что и упомянутый выше, что TSC синхронизируется по ядрам в современных процессорах. но это не дает причины, почему - оригинальный вопрос.! –

+0

Ваша вторая ссылка рассказывает о том, как сообщают чипы Intel Graphics, если TSC не синхронизированы. и как они справляются с дельта-TSC. в статье не говорится о том, как синхронизируются TSC. –

+0

Третья ссылка рассказывает о характеристиках nehalem. и Phase Locked Loop (PLL) будет нормализовать часы для заданных ядер Core-NOT ACROSS и для всех процессоров. –

Смежные вопросы