Почему RDTSC не является инструкцией по сериализации?

Руководства Intel для инструкции RDTSC предупреждают о том, что выполнение по порядку может измениться, когда RDTSC фактически выполняется, поэтому они рекомендуют вставлять перед ним инструкцию CPUID, поскольку CPUID сериализует поток команд (CPUID никогда не выполняется не по порядку). Мой вопрос прост: если у них была возможность выполнять сериализацию инструкций, почему они не делали сериализацию RDTSC? Весь смысл в том, чтобы получить точное время цикла. Есть ли ситуация, при которой вы бы не хотели предшествовать инструкции по сериализации?

Более новые процессоры Intel имеют отдельную инструкцию RDTSCP, которая сериализуется. Корпорация Intel решила ввести отдельную инструкцию, а не изменить поведение RDTSC, что наводит меня на мысль о том, что должна быть некоторая ситуация, когда вы захотите выбрать время с нарушением порядка. Что это?

4 ответа

Решение

Если вы пытаетесь использовать rdtsc, чтобы увидеть, не ошибается ли ветвь, вам нужна версия без сериализации.

//math here
rdtsc
branch if zero to done
//do some work that always takes 1 cycle
done: rdtsc

Если ветвь предсказана правильно, дельта будет небольшой (возможно, даже отрицательной?). Если ветвь неверно предсказана, дельта будет большой.

С сериализованной версией условие ветвления будет разрешено, потому что первый rdtsc ожидает окончания математики.

Поскольку счетчик меток времени, по памяти, был введен в Pentium.

Внеочередное выполнение не появлялось до появления Pentium Pro, когда было уже слишком поздно менять инструкцию.

Это фактически подтверждается (тупо) в документе, который вы предоставляете, со следующим комментарием о Pentium и Pentium/MMX (в 4.2, слегка перефразировано):

Все правила и примеры кода, описанные в разделе 4.1 (Pentium Pro и Pentium II), также применимы к Pentium и Pentium/MMX. Разница лишь в том, что инструкция CPUID не нужна для сериализации.

И из Википедии:

Счетчик меток времени - это 64-битный регистр, присутствующий на всех процессорах x86 начиная с Pentium.

:::

Начиная с Pentium Pro, процессоры Intel поддерживают выполнение вне очереди, где инструкции не обязательно выполняются в порядке их появления в исполняемом файле. Это может привести к тому, что RDTSC будет выполнен позже, чем ожидалось, что приведет к неверному счетчику циклов.


И, насколько я понимаю, основное использование RDTSCP (начиная с i7 и далее) - также дать вам идентификатор процессора, поскольку каждый процессор поддерживает независимый TSC. Это вполне может быть сериализацией, но я вижу, что это скорее простое "исправление ошибки" по сравнению со старой инструкцией.

почему они не сделали сериализацию RDTSC? Весь смысл в том, чтобы получить цикл точного времени

Ну, большую часть времени это получать метки времени с высоким разрешением. По крайней мере, некоторое время эти временные метки используются для показателей производительности. Выполнение интрузивной сериализации, вероятно, потребует сброса конвейера, что может быть очень дорого для приложений, связанных с процессором.

Intel решила ввести отдельную инструкцию, а не изменить поведение RDTSC, что наводит меня на мысль о том, что должна быть некоторая ситуация, когда вы захотите выбрать время вне очереди.

Изменение поведения почти всегда нежелательно. Клиенты Intel будут разочарованы, узнав, что RDTSC делает что-то другое на новых частях.

Как кратко объясняет, RDTSC предшествует концепции "сериализации" инструкций, потому что она была реализована на процессоре в порядке. Добавление этого поведения позже изменит поведение доступа к памяти кода, использующего его, и, таким образом, будет несовместимо для некоторых целей.

Вместо этого, более поздние процессоры имеют RDTSCP инструкция, которая определена как сериализация (на самом деле более сильная: она обещает подождать до тех пор, пока не будут выполнены все инструкции, а не только доступ к памяти), именно по этой причине. Используйте это, если вы работаете на современных процессорах.

Другие вопросы по тегам