WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

rdtsc (англ. Read Time Stamp Counter) — ассемблерная инструкция для платформ x86 и x86_64, читающая счётчик TSC (Time Stamp Counter) и возвращающая в регистрах EDX:EAX 64-битное количество тактов с момента последнего сброса процессора.

rdtsc поддерживается в процессорах Pentium (и совместимых с ними) и более новых. Опкод: 0F 31[1].

rdtscp[2] поддерживается начиная с Intel Nehalem и AMD Family 0x0F[3]. Опкод: 0F 01 F9[4].

Использование

rdtsc чаще всего используется:

  • для измерения времени;
  • для точного измерения временных интервалов, в том числе при проведении оптимизации (измерение времени, необходимого для выполнения конкретных инструкций или их набора);
  • в антиотладочных целях;[5][6]
  • как источник энтропии для генераторов псевдослучайных чисел.[7]

Преимущества

В сравнении с предоставляемыми операционными системами API вроде WINAPI::QueryPerformanceCounter() или gettimeofday() инструкции rdtsc/rdtscp могут предоставлять следующие преимущества:

  • Более высокая точность, особенно в случае архитектур и устаревших операционных систем, не имеющих полноценной поддержки HPET. Такие ОС используют системный таймер невысокой точности (иногда до слайса планировщика, OsTimeSlice, порядка единиц-десятков миллисекунд).
  • Меньшие накладные расходы: инструкции rdtsc/rdtscp исполняются за время порядка десятка тактов, что значительно быстрее выполнения системных вызовов.
  • Не требуют переключения в привилегированный режим Ring0 или в гипервизор в большинстве систем (если команда разрешена в данной ОС).

Проблемы использования

  • RDTSC/RDTSCP потенциально может быть недоступна или запрещена к использованию на конечной системе, где будет использоваться приложение, поэтому должны быть предусмотрены режимы работы программ, не требующие данной команды.
  • Точные замеры могут быть невозможны при однократном исполнении измеряемого фрагмента инструкций из-за влияния кэшей процессора при обращении к памяти. Традиционно решается многократным измерением фрагмента программы или повторением измеряемого фрагмента в цикле.
  • RDTSC может переупорядочиваться с замеряемыми командами на Out-of-Order процессорах. Переупорядочивание можно запретить добавлением сериализующих команд (например, CLD/CLC для Pentium моделей P5, P54[8] или cpuid для более новых) или использованием rdtscp.
  • Инструкции могут быть недоступны:
    • на очень старых процессорах (например, 80486) либо на системах, реализующих архитектуру x86 не в полном объеме.
    • инструкция может быть потенциально превращена в привилегированную (операционной системой установлен 3-й бит в управляющем регистре CR4), и её использование приведет к генерации исключения в программе.
    • инструкцию могут перехватывать системы виртуализации, её использование будет приводить к гипервызову.
  • Режим энергосбережения может влиять на подсчет тактов:
    • В современных процессорах Intel счетчик TSC не зависит от использования технологий энергосбережения и увеличивается на 1 каждый такт, вне зависимости от того, работал ли процессор или находился в состоянии сна.
    • При динамическом изменении частоты процессором (снижения и повышения частоты в технологиях Cool&Quiet, Turbo Boost и подобных).
  • Измерения длительности коротких фрагментов могут быть нестабильными в многоядерных и многопроцессорных системах, или при использовании HyperThreading из-за взаимного влияния со стороны других потоков и загруженности разделяемых процессорных блоков.
  • Счетчики TSC в редких случаях могут быть несинхронизированы в некоторых многоядерных или многопроцессорных системах, в частности:
    • При инициализации процессоров.
    • Возможна рассинхронизация счётчиков в ранних многоядерных системах из-за неверной инициализации процессоров некоторыми BIOS. Исправляется обновлением BIOS или обновлением операционной системы. Существуют программы для проверки на наличие этой ошибки.[9]
    • Операционная система может переключать поток между разными ядрами, имеющими не синхронизированные счетчики. На прикладном уровне можно отследить факт смены ядра на многоядерных системах при помощи инструкции rdtscp, которая, работая аналогично rdtsc, дополнительно возвращает в регистре ECX номер процессорного ядра.

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

Примечания

  1. Intel® 64 and IA-32 Architectures Software Developer’s Manual. — Т. 2 (Instruction Set Reference). — С. 4-301.
  2. Сериализующий вариант инструкции rdtsc, также читающий IA32_TSC_AUX MSR, в котором часто хранится номер ядра.
  3. rdtscp
  4. Intel® 64 and IA-32 Architectures Software Developer’s Manual. — Т. 2 (Instruction Set Reference). — С. 4-303.
  5. Windows Anti-Debug Reference | Symantec Connect Community
  6. Слайд 58 Timing Based Anti-Debugging Архивировано 4 марта 2012 года.
  7. Tom St. Denis, Simon Johnson, Cryptography for developers.
  8. How to optimize for the Pentium family of microprocessors // 1996—2000 by Agner Fog. Chapter «30. Testing speed», перевод Архивировано 19 ноября 2011 года.
  9. ICE Affinity

Ссылки

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии