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

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

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

Ответы

Ответ 1

Если вы пытаетесь использовать rdtsc, чтобы увидеть, что ветвь неверно предсказана, версия, не предназначенная для сериализации, - это то, что вы хотите.

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

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

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

Ответ 2

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

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

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

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

И, Wikipedia:

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

:

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


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

Ответ 3

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

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

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

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

Ответ 4

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

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