x86_64 – Условия сборки и выход из строя

Я не прошу оценки.

( Если бы это было так, я бы сделал это сам. )


Мой вопрос:

Для удобства я склонен избегать косвенных / индексных режимов адресации.

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

Код:

; %esi has the array address. Say we iterate a doubleword (4bytes) array. ; %ecx is the array elements count (0x98767) myloop: ... ;do whatever with %esi add $4, %esi dec %ecx jnz 0x98767; 

Здесь у нас есть сериализованная комбо (dec и jnz), которая предотвращает надлежащее выполнение вне порядка (зависимость).

Есть ли способ избежать этого? (Я не эксперт по сборке).

При оптимизации для процессоров Intel всегда ставьте команду установки флага прямо перед инструкцией условного перехода (если это один из простых, перечисленных в таблице ниже), поэтому они могут скомпенсировать макрос в один uop в декодерах.

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

AMD Bulldozer / Piledriver / Steamroller может jcc test/cmp с любым jcc , но только test/cmp , а не любые другие инструкции ALU. Так что определенно ставьте сравнение с ветвями.

Из руководства микроаргата Agner Fog , таблица 9.2 (для Sandybridge / Ivybridge):

 First | can pair with these | cannot pair with instruction | (and the inverse) | --------------------------------------------- cmp |jz, jc, jb, ja, jl, jg| js, jp, jo add, sub |jz, jc, jb, ja, jl, jg| js, jp, jo adc, sbb |none | inc, dec |jz, jl, jg | jc, jb, ja, js, jp, jo test | all | and | all | or, xor, not, neg | none | shift, rotate | none | Table 9.2. Instruction fusion 

Таким образом, в принципе, inc/dec может использовать макро-предохранитель с jcc до тех пор, пока условие зависит только от битов, которые модифицируются inc/dec .

(В противном случае они не являются макро-предохранителями, и вы получаете дополнительный uop, вставленный для объединения флагов (например, когда вы читаете eax после написания al ). Или на более ранних процессорах, срыв частичных флагов.)

Core2 / Nehalem был более ограничен возможностями макросъемки (только для CMP / TEST с более ограниченными комбинациями JCC), а Core2 не мог скомпенсировать макросов в режиме 64 бит.

Прочтите также Agner Fog, оптимизирующие руководства asm и C, если вы еще этого не сделали. Они полны необходимых знаний.

Interesting Posts

Как использовать .jar-файлы в NetBeans?

Как установить JSTL? Абсолютный uri: http://java.sun.com/jstl/core не может быть разрешен

802.1x с Hyper-V

Объявление переменной в операторе switch C #

Получить UITableView для перехода к выбранному UITextField и избегать скрытия клавиатуры

Поддерживает ли Stream.forEce порядок столкновений последовательных streamов?

Звук Realtek HD Audio с низким и плохим качеством после обновления Windows 10

Пейзажный режим ТОЛЬКО для iPhone или iPad

Добавить программы для запуска поиска в меню без добавления плитки

Java: как мне получить литерал classа из общего типа?

Весенняя безопасность: добавление «При успешном прослушивании событий входа в систему»

Как переключить ddrescue из `/ dev / sdq1` в` / dev / sdq`, если я уже сделал резервную копию данных из `/ dev / sdq1`?

Как захватить текущий снимок экрана и повторное использование кода? (iPhone SDK)

Могу ли я изменить среду для каждого процесса в Windows (например, в Unix)?

Как читать файл csv в R, где некоторые значения содержат символ процента (%)

Давайте будем гением компьютера.