lddqu
использовал другую стратегию, чем _ 2_ на P4, но одинаково работает на всех остальных процессорах, которые его поддерживают. Особых недостатков нет (поскольку инструкции SSE3 не занимают лишних байтов машинного кода и на данный момент довольно широко поддерживаются даже AMD), но и положительных сторон вообще нет, если вы не заботитесь о P4.
Dark Shikari (один из ведущих разработчиков видеокодеров x264, ответственный за множество ускорений SSE) подробно рассказывал об этом в своем блоге в 2008 году. Это ссылка на archive.org, поскольку оригинал не в сети, но в его блоге есть много хороших вещей.
Самым интересным моментом, который он отмечает, является то, что Core2 по-прежнему имеет медленные невыровненные загрузки, при этом выполнение вручную двух выровненных загрузок и palignr
может быть быстрее, но доступно только при немедленном подсчете сдвига. Поскольку Core2 работает lddqu
так же, как movdqu
, это не помогает.
Судя по всему, Core1 специально реализует lddqu
, так что, в конце концов, это не только P4.
Это сообщение в блоге Intel об истории lddqu / movdqu (которую я нашел за 2 секунды с помощью google для lddqu vs movdqu
, / scold @Zboson) объясняет:
(только на P4): инструкция работает, загружая 32-байтовый блок, выровненный по 16-байтовой границе, извлекая 16 байтов, соответствующих невыровненному доступу.
Поскольку инструкция загружает больше байтов, чем запрошено, применяются некоторые ограничения на использование. Lddqu следует избегать в областях памяти без кэширования (UC) и с комбинированной записью (USWC). Кроме того, следует избегать использования lddqu в ситуациях, когда ожидается пересылка загрузки из хранилища.
Думаю, это объясняет, почему они не просто использовали эту стратегию для реализации movdqu
все время.
Я предполагаю, что у декодеров нет доступной информации о типе памяти, и именно тогда нужно принять решение, в какие мопы декодировать инструкцию. Таким образом, попытка «разумно» использовать лучшую стратегию для оппортунистической работы с памятью WB, вероятно, была невозможна, даже если бы это было желательно. (Что не из-за переадресации магазина).
Резюме из этого сообщения в блоге:
начиная с марки Intel Core 2 (микроархитектура Core, с середины 2006 г., процессор Merom и выше) до будущего: lddqu делает то же самое, что и movdqu
Другими словами:
* если ЦП поддерживает дополнительные расширения SIMD Streaming 3 (SSSE3) -> lddqu делает то же самое, что и movdqu,
* Если ЦП не поддерживает SSSE3, но поддерживает SSE3 -> перейдите к lddqu ( и обратите внимание, что рассказ о типах памяти)
person
Peter Cordes
schedule
14.07.2016