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