Intel JCC Erratum - действительно ли JCC следует рассматривать отдельно?

Корпорация Intel запустила обновление микрокода, чтобы исправить ошибку, называемую «Erratum Jump Conditional Code (JCC)». Микрокод обновления привел к неэффективности некоторых операций из-за отключения кода в ICache при определенных условиях.

Опубликованный документ под названием Устранение ошибок в условном коде переходов перечисляет не только JCC, но и перечисляет: безусловные переходы, условные переходы, условные переходы с макросъемкой, вызовы и возврат.

Переключатель MSVC _2 _ в документации упоминается:

В разделе / ​​QIntel-jcc-erratum компилятор обнаруживает инструкции перехода и объединенные макросами инструкции перехода, которые пересекаются или заканчиваются на 32-байтовой границе.

Вопросы следующие:

  • Есть ли причины рассматривать JCC отдельно от других прыжков?
  • Есть ли причины рассматривать макрослитые JCC, упомянутые отдельно от других JCC?

person Alex Guteniev    schedule 10.06.2020    source источник
comment
NB (ссылка 10K): этот вопрос обсуждался в Meta .   -  person TylerH    schedule 11.08.2020
comment
@TylerH, да, я удалил свой мета-вопрос, поскольку он обвинял рецензентов в непонимании вопроса, но комментаторы указали, что отзывы были правильными в соответствии со стандартами SO.   -  person Alex Guteniev    schedule 11.08.2020


Ответы (1)


Макро-слитные прыжки следует упомянуть отдельно, потому что это означает, что весь cmp/jcc или что-то еще уязвимо для этого замедления, если cmp касается границы, а сам jcc - нет. Поскольку кеш uop будет иметь один uop для обеих машинных инструкций x86 вместе с начальным адресом инструкции без перехода.

Если бы все говорили только прыжки, можно было бы ожидать, что только сам JCC / JMP / CALL / RET должен избегать касания границы 32B. Так что неплохо выделить взаимодействие с макро-слиянием.


Это замедление (для всех переходов) является результатом смягчения / обходного пути микрокода для недостатка конструкции оборудования. Невозможность выполнять переходы кэша uop-cache, затрагивающие 32-байтовую границу, не является исходной ошибкой, это побочный эффект лечения.

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

Например, в Skylake-Xeon (SKX) исходная ошибка задокументирована как SKX102 в документе Intel список ошибок обновления спецификации для этого uarch:

SKX102. Процессор может непредсказуемо вести себя в сложной последовательности условий, в которых задействованы ветви, пересекающие 64-байтовые границы

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

Следствие: при возникновении этой ошибки система может вести себя непредсказуемо.

Обходной путь: BIOS может содержать обходной путь для этой ошибки. [т.е. обновление микрокода]

Статус: исправлений нет.


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

Кстати, выровненная по 32 байта процедура делает не помещается в кэш uops, есть снимок экрана с соответствующей диаграммой из Intel PDF, на который вы ссылались, а также некоторые другие ссылки и подробности о влиянии на производительность.

person Peter Cordes    schedule 10.06.2020