Мне интересно, как циклы различных размеров выполняются на последних процессорах x86, как функция количества uops.
Здесь цитата из Питера Кордеса, которая подняла вопрос о нечетных числах в другом вопросе:
Я также обнаружил, что ширина канала uop из буфера цикла не является постоянная 4 за цикл, если цикл не кратен 4 мкп. (Т.е. это abc, abc,...; а не abca, bcab,...). Agner Fog microarch doc к сожалению, не было ясно, что это ограничение буфера цикла.
Проблема заключается в том, должны ли циклы быть кратными N uops для выполнения с максимальной пропускной способностью uop, где N - ширина процессора. (т.е. 4 для последних процессоров Intel). Есть много осложняющих факторов, когда речь идет о "ширине" и подсчете голосов, но я в основном хочу их игнорировать. В частности, не предполагайте микро- или макро-слияния.
Питер дает следующий пример цикла с 7 uops в своем теле:
В 7-футовом цикле будут выпущены группы из 4 | 3 | 4 | 3 |... Я не тестировал больше петли (которые не вписываются в буфер цикла), чтобы увидеть, возможно ли это для первая инструкция из следующей итерации для выпуска в том же как принятая ветвь к ней, но я предполагаю, что нет.
В более общем случае утверждение состоит в том, что каждая итерация цикла с x
uops в его теле займет не менее ceil(x / 4)
итераций, а не просто x / 4
.
Это верно для некоторых или всех последних x86-совместимых процессоров?