Операция выборки ЦП TSC, особенно в многоядерной многопроцессорной среде

В мире Linux, чтобы получить таймер/часы с точностью до наносекунд, можно использовать:

#include 

int foo()
{
   timespec ts;

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

Этот ответпредлагает подход asmдля прямого запроса для тактирования процессора с помощью инструкции RDTSC.

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

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

РЕДАКТИРОВАТЬ

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

Изменить

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

Заключение

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

14
задан Community 23 May 2017 в 12:01
поделиться