Префиксы Intel TSX выполняются (безопасно) на AMD как NOP? - PullRequest
3 голосов
/ 20 апреля 2020

У меня есть код синхронизации MASM для приложения, которое работает на машинах Intel и AMD x86.

Я бы хотел улучшить его, используя префиксы Intel TSX, в частности XACQUIRE и XRELEASE.

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

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

1 Ответ

5 голосов
/ 20 апреля 2020

xacquire/xrelease являются просто префиксами REP F2 / F3 и безопасно игнорируются всеми процессорами, которые не поддерживают эту функцию , включая не Intel. Вот почему Intel выбрала эту кодировку для префиксов. Это даже лучше, чем NOP, который должен декодироваться как отдельная инструкция.

В общем случае (у разных поставщиков) процессоры игнорируют префиксы REP, которые они не понимают. Таким образом, новые расширения могут использовать REP как часть их кодирования, если для них полезно декодировать как-то еще на старых процессорах, вместо #UD.

Я не думаю, что AMD может ввести несовместимое значение для префиксов rep на lock ed инструкции или mov-store - это сломало бы реальные двоичные файлы, которые уже используют эти префиксы Например, я уверен, что некоторые сборки libpthread в основных дистрибутивах GNU / Linux использовали это для включения аппаратной блокировки блокировки и не используют динамическую диспетчеризацию c CPU для запуска другого кода, основанного на CPUID.


Использование REP в качестве обязательного префикса для новой инструкции обратного сжатия было выполнено до , например, с rep nop = pause или rep bsf = tzcnt. (Полезно для компиляторов, потому что tzcnt быстрее на некоторых процессорах и дает тот же результат, если входные данные известны как ненулевые.) И rep ret в качестве обходного пути для предикторов AMD для предбульдозерных ветвей широко используется G CC - Что означает `rep ret`? . Этот бессмысленный REP определенно работает (беззвучно игнорируется) на практике на AMD.

(Обратное значение не true. Вы не можете написать программное обеспечение, которое рассчитывает на бессмысленный префикс REP, игнорируемый future CPU. Некоторое более позднее расширение может придать ему значение, например, как rep bsr, которое работает как lzcnt и дает другой результат. Вот почему Intel документирует эффект бессмысленных префиксов как «неопределенный». )


Я бы хотел улучшить его, используя префиксы Intel TSX, в частности XACQUIRE и XRELEASE.

К сожалению, обновления микрокода, по-видимому, отключили HLE (аппаратная блокировка Elision) часть TSX на всех процессорах Intel . (Возможно, для смягчения атак по боковому каналу TAA ). Это было то же самое обновление, которое сделало jcc в конце 32-байтового блока недоступным для кэширования в кэше UOP, поэтому по бенчмаркингу существующего кода трудно определить, какое влияние оказывает перфорированная часть без HLE.

https://news.ycombinator.com/item?id=21533791 / Устранена ли проблема с аппаратной блокировкой навсегда из-за смягчения действия Призрака? (да, но нет, вероятно, причина не в Призраке конкретно. IDK, если он вернется. )

Если вы хотите использовать аппаратную транзакционную память на x86, я думаю, что ваш единственный вариант - RTM (xbegin / xend), другая половина TSX. Операционные системы также могут отключить его после последнего обновления микрокода; Я не уверен, что по умолчанию для типичных систем, и это может измениться в будущем, так что это что-то проверить, прежде чем вкладывать время разработки во что-либо.

Там нет AFAIK способ использования RTM, но прозрачно возвращается к блокировке; xbegin / xend - недопустимые инструкции, которые выдают ошибку #UD, если отсутствует бит функции CPUID.

Если вы хотели прозрачного обратного сжатия, вы должны были использовать HLE, так что это настоящий позор (и TSX в общем) переживал такие тяжелые времена, постоянно отключаясь из-за обновлений микрокода. (Ранее в Haswell и Broadwell из-за возможных ошибок правильности. Это превращается в Charl ie Brown ситуацию .)

...