Чендлер изменил вывод asm компилятора, потому что это простой способ провести одноразовый эксперимент, чтобы выяснить, будет ли изменение полезно , без , выполняя все, что вы ' Обычно я хочу включить цикл asm или функцию как часть исходного кода для проекта.
Генерируемый компилятором asm, как правило, является хорошей отправной точкой для оптимизированного цикла, но фактически сохранение всего файла как есть, не является хорошим или даже жизнеспособным способом фактически поддерживать реализацию цикла asm как часть программы. , См. Ответ @ Аконкагуа.
Кроме того, он отрицает необходимость иметь какие-либо другие функции в файле, написанном на C ++, и быть доступным для оптимизации во время компоновки.
Re: фактически зажим:
Обратите внимание, что Чендлер просто экспериментировал с изменениями не векторизованного кода и отключил развертывание + авто-векторизацию. Надеемся, что в реальной жизни вы можете выбрать SSE4.1 или AVX2 и позволить компилятору автоматически векторизовать pminsd
или pminud
для зажима int со знаком или без знака до верхней границы. (Также доступно для элементов других размеров. Или без SSE4.1, только SSE2, может быть, вы можете 2x PACKSSDW
=> packuswb
(без знака насыщения), а затем распаковать с нулями до 4 векторов меча элементы. (Если вы не можете просто использовать вывод uint8_t[]
!)
И кстати, в комментариях к видео Чендлер сказал, что оказывается, что он допустил ошибку, и эффект, который он увидел, не был на самом деле из-за предсказуемой ветви против cmov. Возможно, это было связано с выравниванием кода, потому что изменение с mov %ebx, (%rdi)
на movl $255, (%rdi)
имело значение!
(ЦП AMD, как известно, не имеют регистров чтения с задержками, как у семейства P6, не должно возникнуть никаких проблем с сокрытием цепочки dep в cmov, связывающей хранилище с нагрузкой, против разрыва с предсказанием ветвлений + предположениями прошлого филиал.)
Вы очень редко действительно хотите использовать рукописный цикл. Часто вы можете удерживать и / или обманывать свой компилятор, чтобы сделать asm более похожим на то, что вы хотите, просто изменив исходный код C ++. Тогда будущий компилятор может настраиваться по-другому для -march=some_future_cpu
.