TSC (то, что использует rdtsc) часто не синхронизируются в многопроцессорных системах. Это может помочь установить сродство ЦП, чтобы привязать процесс к одному ЦП.
Вы также можете получить временные метки из таймеров HPET, если они доступны, которые не подвержены той же проблеме. .
Что касается повторяемости, эти различия верны. Вы можете отключить кеширование, дать процессу приоритет в реальном времени и / или (если в Linux или что-то подобное) перекомпилировать ядро с более низкой фиксированной частотой прерывания таймера (той, которая выполняет квантование времени). Вы не можете полностью устранить дисперсию, по крайней мере, нелегко и не в обычных комбинациях CPU + OS.
В общем, из соображений удобства программирования, надежности и переносимости я предлагаю вам использовать то, что предлагает ОС. Если он предлагает таймеры с высокой точностью, используйте соответствующий помощник ОС.
(На всякий случай, если вы пытаетесь провести атаку времени на криптосистему, что ж, вам придется жить с 1. этой случайностью и 2. общей защитой, которые делают систему непредсказуемой по уважительным причинам, поэтому функция может не работать. быть детерминированным по времени.)
РЕДАКТИРОВАТЬ: добавлен параграф о таймерах, которые может предложить ОС.
РЕДАКТИРОВАТЬ: это относится к Linux. Для привязки процесса к одному процессору (для точного чтения из RDTSC) вы можете использовать sched_setaffinity (2). И вот код одного из моих проектов, использующий его для других целей (отображение потоков на процессоры). Это должна быть ваша первая попытка. Что касается HPET, вы можете использовать обычные вызовы POSIX, например эти , если ядро и машина поддерживают эти таймеры.
person
Eduard - Gabriel Munteanu
schedule
03.02.2009