В мире Linux, чтобы получить таймер/часы с точностью до наносекунд, можно использовать:
#include
int foo()
{
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
//--snip--
}
Этот ответпредлагает подход asm
для прямого запроса для тактирования процессора с помощью инструкции RDTSC
.
В многоядерной, многопроцессорной архитектуре, как эти тактовые импульсы/значение таймера синхронизируются между несколькими ядрами/процессорами? Я так понимаю, что там врожденное ограждение делается. Верно ли это понимание?
Можете ли вы предложить какую-нибудь документацию, подробно объясняющую это? Меня интересуют микроархитектуры Intel Nehalem и Sandy Bridge.
РЕДАКТИРОВАТЬ
Ограничение процесса одним ядром или процессором не вариант, так как процесс действительно огромен (с точки зрения потребляемых ресурсов) и хотел бы оптимально использовать все ресурсы в машине, включая все ядра и процессоры.
Изменить
Спасибо за подтверждение того, что TSC синхронизируется между ядрами и процессорами. Но мой первоначальный вопрос заключается в том, как выполняется эта синхронизация? это с каким-то ограждением? знаете ли вы какую-либо общедоступную документацию?
Заключение
Спасибо всем за участие. Вот вывод по этому обсуждению: TSC синхронизируются при инициализации с помощью СБРОСА, который происходит между ядрами и процессорами в многопроцессорной/многоядерной системе. И после этого каждое Ядро само по себе. TSC остаются инвариантными с помощью контура фазовой автоподстройки частоты, который нормализует колебания частоты и, следовательно, колебания тактовой частоты внутри данного ядра, и таким образом TSC остаются синхронизированными между ядрами и процессорами.