Счетчик отметок времени - PullRequest
3 голосов
/ 02 ноября 2010

Я использую счетчик меток времени в моей программе на C ++, запрашивая регистр. Однако одна проблема, с которой я сталкиваюсь, заключается в том, что функция для получения метки времени может быть получена от другого процессора. Как я могу гарантировать, что моя функция всегда будет получать метку времени от одного и того же процессора или в любом случае для синхронизации процессора? Кстати, моя программа работает на 4-х ядерном сервере в Fedora 13 64 бит.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

Посмотрите на следующую выдержку из руководства Intel. В соответствии с разделом 16.12, я думаю, что «новые процессоры» ниже относятся к любому процессору, более новому, чем Pentium 4. Вы можете одновременно и атомарно определить значение tsc и идентификатор ядра, используя инструкцию rdtscp, если она поддерживается. Я не пробовал это все же. Удачи.

Руководство разработчика программного обеспечения для архитектуры Intel 64 и IA-32

Том 3 (3A и 3B): Руководство по системному программированию:

Глава 16.12.1 Инвариант TSC

Счетчик меток времени в более новых процессорах может поддерживать расширение в качестве инварианта TSC. Поддержка процессором инвариантного TSC обозначена CPUID.80000007H: EDX [8]

.

Инвариант TSC будет работать с постоянной скоростью во всех ACPI P-, C-. и Т-состояния. Это архитектурное поведение движется вперед. На процессорах с инвариантом TSC поддержка, ОС может использовать TSC для служб настенного таймера (вместо ACPI или Таймеры HPET). Чтения TSC намного более эффективны и не требуют дополнительных затрат связан с переходом по кольцу или доступом к ресурсу платформы.

В Intel также есть руководство по тестированию производительности выполнения кода, в котором обсуждается связь процессора с rdtsc - http://download.intel.com/embedded/software/IA/324264.pdf

1 голос
/ 02 ноября 2010

По моему опыту, разумно вообще избегать TSC, если только вы действительно не хотите измерять отдельные такты на отдельных ядрах / процессорах.

Потенциальные проблемы с TSC:

  • Масштабирование частоты. Счетчик не увеличивается линейно со временем ...
  • Разные тактовые частоты на разных процессорах / ядрах (я бы не стал исключать разное масштабирование частоты на разных процессорах или даже разно тактированных процессорах - хотя последние должны быть редкими). ​​
  • Несинхронизированные счетчики на разных процессорах / ядрах (даже если они используют одинаковую частоту).

В основном это сводится к тому, что вы можете использовать TSC только для измерения истекших циклов ЦП (не затраченного времени) на одном ЦП в однопоточном приложении, , если , вы принудительно привязываете к потоку.

Предпочтительной альтернативой является использование системных функций. Наиболее переносимым (в Unix / Mac) является gettimeofday () , что обычно очень точно. Более подходящей функцией может быть clock_gettime () , но сначала проверьте, поддерживается ли она в вашей системе. Под Windows вы можете безопасно использовать QueryPerformanceCounter () .

0 голосов
/ 02 ноября 2010

Вы можете использовать функцию sched_setaffinity или процессор, которая позволяет вам создавать процессор и назначать задачи для набора.

...