Я выполняю некоторые тайм-ауты ядра 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