RDTSCP против RDTSC + CPUID

Я делаю некоторые тайминги ядра Linux, особенно в пути обработки прерываний. Я использовал RDTSC для таймингов, однако недавно я узнал, что это не обязательно точно, так как инструкции могут выполняться не по порядку.

Я тогда попробовал:

RDTSC + CPUID (в обратном порядке, здесь) для очистки конвейера, ипонесенные до 60x накладные расходы (!) на виртуальной машине (моя рабочая среда) из-за гипер-звонков и еще много чего. Это как с включенной, так и без включенной виртуализации HW.

Совсем недавно я столкнулся с инструкцией RDTSCP *, которая, кажется, выполняет то же, что и RDTSC + CPUID, но более эффективно, поскольку это более новая инструкция - только 1,5x-2x, соответственно.

Мой вопрос: естьRDTSCP действительно точен как точка измерения, и является ли это "правильным" способом определения времени?

Кроме того, чтобы быть более понятным, мое время по сути так:

Сохранить текущее значение счетчика циклаВыполните один тип теста (например, диск, сеть)Добавьте дельту текущего и предыдущего счетчика цикла к значению аккумулятора и увеличьте счетчик для каждого отдельного прерывания.В конце разделите дельта / аккумулятор на количество прерываний, чтобы получить среднюю стоимость цикла на прерывание.

*http://www.intel.de/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf страница 27

Ответы на вопрос(3)

Ваш ответ на вопрос