Макро-слитные прыжки следует упомянуть отдельно, потому что это означает, что весь 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