Я делаю микро-оптимизацию в критичной для производительности части кода и нахожусь в последовательности инструкций (в синтаксисе AT & T):
add %rax, %rbx
mov %rdx, %rax
mov %rbx, %rdx
Я думал, что у меня наконец был прецедент для xchg
, который позволил бы мне побрить инструкцию и написать:
add %rbx, %rax
xchg %rax, %rdx
Однако, к моему уменьшению, я нашел из таблиц инструкций Agner Fog , что xchg
- это 3 команды микрооперации с 2 лайнер цикла на Сэнди-Бридже, Айви-Бридж, Бродвелл, Хасуэлл и даже Скайлак. 3 целых микрооперации и 2 цикла латентности! 3 микрооперации отбрасывают мою 4-1-1-1 каденцию, а задержка в 2 цикла делает ее хуже, чем оригинал, в лучшем случае, так как последние две команды в оригинале могут выполняться параллельно.
Теперь... Я понимаю, что процессор может сломать инструкцию в micro-ops, которые эквивалентны:
mov %rax, %tmp
mov %rdx, %rax
mov %tmp, %rdx
где tmp
является анонимным внутренним регистром, и я предполагаю, что последние два микрооператора могут выполняться параллельно, поэтому латентность составляет 2 цикла.
Учитывая, что переименование регистров происходит на этих микро-архитектурах, для меня не имеет смысла, что это делается таким образом. Почему бы переименовать регистратор не просто заменить метки? Теоретически это будет иметь латентность всего в 1 цикл (возможно, 0?) И может быть представлена в виде одного микрооператора, поэтому было бы намного дешевле.