RDTSCP против RDTSC + CPUID
Я делаю некоторые тайминги ядра Linux, особенно в пути обработки прерываний. Я использовал RDTSC для таймингов, однако недавно я узнал, что это не обязательно точно, так как инструкции могут выполняться не по порядку.
Я тогда попробовал:
RDTSC + CPUID (в обратном порядке, здесь) для очистки конвейера, ипонесенные до 60x накладные расходы (!) на виртуальной машине (моя рабочая среда) из-за гипер-звонков и еще много чего. Это как с включенной, так и без включенной виртуализации HW.
Совсем недавно я столкнулся с инструкцией RDTSCP *, которая, кажется, выполняет то же, что и RDTSC + CPUID, но более эффективно, поскольку это более новая инструкция - только 1,5x-2x, соответственно.
Мой вопрос: естьRDTSCP действительно точен как точка измерения, и является ли это "правильным" способом определения времени?
Кроме того, чтобы быть более понятным, мое время по сути так:
Сохранить текущее значение счетчика циклаВыполните один тип теста (например, диск, сеть)Добавьте дельту текущего и предыдущего счетчика цикла к значению аккумулятора и увеличьте счетчик для каждого отдельного прерывания.В конце разделите дельта / аккумулятор на количество прерываний, чтобы получить среднюю стоимость цикла на прерывание.