Часть связанной статьи, которая заставила меня думать, что это можно оптимизировать, это: «функция перемещения заботится о проверке эквивалентных местоположений»
Это говорит о (move r x)
функция в SBCL, а не инструкция x86 mov
.Речь идет об оптимизации во время генерации кода из этого низкоуровневого промежуточного языка, а не во время выполнения аппаратными средствами.
Ни mov %eax, %eax
, ни nop
не являются полностью бесплатными.Они оба требуют пропускной способности внешнего интерфейса, и mov %eax,%eax
даже не является NOP в 64-битном режиме (он ноль расширяет EAX до RAX, и потому что это тот же регистр, что исключение mov на процессорах Intel не удается).
См. Может ли MOV x86 действительно быть "свободным"?Почему я вообще не могу воспроизвести это? , чтобы больше узнать о узких местах пропускной способности внешнего / внутреннего интерфейса и задержке.
Возможно, вы видите некоторый побочный эффект кодавыравнивание, или, может быть, эффектный эффект задержки пересылки в хранилище семейства Sandybridge, как в Добавление избыточного назначения ускоряет код при компиляции без оптимизации , потому что вы также компилировали с отключенной оптимизацией, заставляя ваш компилятор создавать антиоптимизированный коддля последовательной отладки, которая сохраняет счетчик цикла в памяти.(~ 6 циклов переносимых в цикле зависимостей через сохранение / перезагрузку вместо 1 итерации за такт для обычного крошечного цикла.)
Если ваши результаты воспроизводимы с большим числом итераций, вероятно, есть какое-то микроархитектурное объяснение того, чтовы видите, но, вероятно, это не связано с тем, что вы пытались измерить.
Конечно, вам также нужно исправить ошибку mov %ebx, %eax;
в f3
, чтобы успешно компилировать с включенной оптимизацией.Закупорка EAX без указания компилятора наступит на сгенерированный компилятором код.Вы не объяснили, что вы пытались проверить с этим, так что IDK, если это была опечатка.