c - компьютера - система команд это



Слейте конвейер команд Intel Core 2 Duo? (1)

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

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

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


Насколько мне известно, нет инструкции, которая конкретно «истощает» трубопровод. Это можно легко выполнить, используя инструкцию сериализации.

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

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

cpuid
rdtsc
# stuff
cpuid
rdtsc

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

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

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





microbenchmark