Слить инструментарий Intel Core 2 Duo? - PullRequest
8 голосов
/ 22 февраля 2009

Я пишу некоторый код микро-бенчмаркинга для некоторых очень коротких операций на C. Например, я измеряю одну вещь - сколько циклов необходимо для вызова пустой функции в зависимости от количества переданных аргументов.

В настоящее время я использую инструкцию RDTSC до и после каждой операции, чтобы получить счетчик циклов ЦП. Тем не менее, я обеспокоен тем, что инструкции, выпущенные до первого RDTSC, могут замедлить фактические инструкции, которые я измеряю. Я также обеспокоен тем, что полная операция может не завершиться до того, как будет выпущен второй RDTSC.

Кто-нибудь знает инструкцию x86, которая заставляет выполнять все инструкции в полете перед выпуском новых инструкций? Мне сказали, что CPUID может это сделать, но я не смог найти никакой документации, которая бы так говорила.

1 Ответ

9 голосов
/ 22 февраля 2009

Насколько мне известно, нет инструкции, которая бы специально "осушала" трубопровод. Этого легко достичь, используя инструкцию сериализации.

CPUID - это инструкция сериализации, которая означает именно то, что вы ищете. Каждая инструкция выдается до того, как она гарантированно будет выполнена перед инструкцией CPUID.

Таким образом, следующий эффект должен получить желаемый эффект:

cpuid
rdtsc
# stuff
cpuid
rdtsc

Но, кроме того, я не рекомендую вам это делать. На ваши «вещи» все еще могут влиять многие другие вещи вне вашего контроля (такие как кэши ЦП, другие процессы, запущенные в системе и т. Д.), И вы никогда не сможете устранить их все. Лучший способ получить точную статистику производительности - выполнить операции, которые вы хотите измерить, по крайней мере, несколько миллионов раз и усреднить время выполнения пакета.

Редактировать: В большинстве ссылок на инструкции для CPUID упоминаются его свойства сериализации, такие как приложение к руководству по NASM B .

Редактировать 2 : Также, возможно, захотите взглянуть на этот связанный вопрос .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...