Семантика латентности регистров чтения на x86 ASM

349
IamIC

В соответствии с таблицами команд А. Фога, Ivy Bridge имеет 3 цикла задержки для команды MOV.

Поэтому для перемещения RAX по адресу в RCX потребуется 3 цикла:

 mov [rcx], rax 

Мой вопрос: означает ли это, что RAX, который читается, не может быть изменен в течение следующих 2 часов? В частности, может ли следующее вызвать задержку выполнения:

 mov [rcx], rax inc rax 
1

1 ответ на вопрос

1
Mokubai

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

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

Это называется выполнением вне очереди, и это может помочь снизить стоимость остановок процессора при ожидании длинных инструкций, подобных этим.


Дальнейшее уточнение ...

Я должен был прочитать ваш пример лучше, я не верю, что mov [rcx], raxинструкция вызовет остановку inc raxкоманды, но вызовет что-либо, зависящее от rcxостановки.

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

Таким образом, я бы предположил, что регистр RAX либо переименовывается, так как инструкция отправляется на выполнение, либо кодируется в u-ops для инструкции. Следующая инструкция может работать с этим регистром, если она не зависит от результатов предыдущей операции, сохраненной в этом регистре.

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

Я полагаю, что в RAX также будет связан в течение 3 циклов или будет другим, поскольку RAX будет использоваться в цикле 1 для определения адреса, а следующие 2 цикла выборка и магазин? IamIC 8 лет назад 0
@IanC Я думаю, я вижу, куда ты идешь. Связан ли RAX (и таким образом удерживает ли 'inc`) в течение всего периода, неизвестно без каких-то довольно специфических архитектурных знаний, которых у меня нет. Диспетчер может легко закодировать значение, хранящееся в RAX, в u-ops для команды `movq` и, таким образом, освободить регистр для (почти) немедленного использования` inc`. На странице также перечисляется «взаимная пропускная способность», посредством которой может быть выдана другая инструкция такого типа, и я предположил бы, что за тот же промежуток времени может быть выдана инструкция с аналогичными зависимостями. Mokubai 8 лет назад 2
Это, конечно, сложный вопрос. Соотношение между задержкой и обратной пропускной способностью является сложным. На данный момент я бы сказал, что тестирование - это единственный способ узнать. Но проверить что-то на этом низком уровне, скорее всего, нетривиально. IamIC 8 лет назад 0
@IanC, как вы говорите, это не совсем тривиально выяснить, есть много очень продвинутых функций, которые могут определить, будет ли инструкция блокировать дальнейшее выполнение, и если да, то как долго. Я отредактировал свой ответ, чтобы отразить то, что, на мой взгляд, является наиболее логичным результатом, но единственные примеры, которые я могу найти по этому поводу, касаются операций с регистрами с разными именами, а не две инструкции, которые зависят только от текущего состояния регистра. Mokubai 8 лет назад 0

Похожие вопросы