Я думаю, они обнаружили, что CPUID внутри интервала измерения вызывает дополнительную изменчивость общего времени.Их предлагаемое исправление в 3.2 Улучшения с использованием инструкции RDTSCP подчеркивает тот факт, что в указанном интервале нет CPUID, когда они используют CPUID
/ RDTSC
для запуска и RDTSCP
/ CPUID
для остановки.
Возможно, они могли бы обеспечить EAX = 0 или EAX = 1 перед выполнением CPUID, чтобы выбрать лист данных CPUID для чтения (http://www.sandpile.org/x86/cpuid.htm#level_0000_0000h), в случае, если время CPUID зависит от того, какой запрос вы делаете.Кроме этого, я не уверен, почему это так.
Обратите внимание, что встроенный ассемблер в официальном документе Intel отстой: эти инструкции mov
не нужны, если вы используете правильные выходные ограничения, такие как "=a"(low), "=d"(high)
. * * * * * * * * * * * * * * * * * * * * * *
.