lddqu
использовал другую стратегию, чем movdqu
на P4, но работает идентично на всех других поддерживающих его процессорах. Нет особого недостатка (поскольку инструкции SSE3 не берут никаких лишних байтов машинного кода и довольно широко поддерживаются даже AMD на данный момент), но без роста вообще, если вы не заботитесь о P4.
Dark Shikari (один из разработчиков видеокодера x264, ответственный за множество ускорений SSE) went into detail about it in a blog post in 2008. Это ссылка archive.org, поскольку оригинал находится в автономном режиме, но в его блоге много хорошего.
Самый интересный момент, который он делает, заключается в том, что Core2 все еще имеет медленные неуравновешенные нагрузки, где вручную выполняет две согласованные нагрузки, а palignr
может быть быстрее, но доступен только с немедленным количеством сдвигов. Поскольку Core2 работает lddqu
так же, как movdqu
, это не поможет.
Очевидно, что Core1 действительно использует lddqu
, поэтому это не просто P4.
Это Intel blog post об истории lddqu/movdqu (который я нашел в 2 секунды с помощью Google для lddqu vs movdqu
,/поругать @Zboson) объясняет:
(на P4 только): Инструкция работает с , загружая 32-байтовый блок, выровненный по 16-байтовой границе, извлечение 16 байтов, соответствующих невыложенному доступу.
Поскольку инструкция загружает больше байтов, чем запрашивается, применяются некоторые ограничения использования. Lddqu должен быть избежать в областях памяти Uncached (UC) и Write-Combining (USWC). Кроме того, по его реализации следует избегать lddqu в в ситуациях, когда ожидается перенаправление загрузки.
Я думаю, это объясняет, почему они не просто использовали эту стратегию для реализации movdqu
все время.
Я полагаю, что декодеры не имеют доступной информации о типе памяти, и именно тогда должно быть принято решение о том, для чего нужно декодировать инструкцию. Поэтому попытка «умного» использования оппортунистической стратегии в отношении WB-памяти, вероятно, была невозможна, даже если бы это было желательно. (Который не из-за хранения-пересылки).
резюме из этого сообщения в блоге:
начиная с Intel Core 2 марки (ядро микроархитектуры, начиная с середины 2006 года, Merom CPU и выше) до будущего: lddqu делает то же самое, movdqu
В других словах:
* если процессор поддерживает Справочный потоковый SIMD Extensions 3 (SSSE3) -> lddqu делает то же самое, как movdqu,
* Если процессор не поддерживает SSSE3 но поддерживает SSE3 -> идти на lddqu (и заметим, что рассказ о типах памяти)
Пейджинговые @PeterCordes ... –
Я попробовал оба, и не видел разницы в производительности (пробовал его на Core i7 2600) – Rotem
@Rotem это возможно, это только лучше до Nehalem (т.е. на системах с SSE3 и SSSE3, но не SSE4.1), но это только предположение. –