2016-07-14 7 views
4

Я хотел бы узнать больше об _mm_lddqu_si128 встроенной (инструкции с SSE3), в частности, по сравнению с встроенной (инструкция movdqu с SSE2) _mm_loadu_si128.Быстрая целая SSE невыложенная нагрузка, которая редко используется

Я только открыл _mm_lddqu_si128 сегодня. Intel присущее руководство говорит

это внутренний может работать лучше, чем _mm_loadu_si128 когда данные пересекает границу строки кэша

и a comment says это

будут работать лучше при определенных обстоятельствах, но никогда работать хуже.

Так почему же он не используется больше (SSE3 - довольно низкая полоса, так как у всех процессоров Core2 есть)? Почему он может работать лучше, когда данные пересекают строку кэша? Возможно, lddqu может быть лучше на определенном подмножестве процессоров. Например. до Нехалема?

Я понимаю, что мог прочитать руководство Intel, чтобы найти ответ, но я думаю, что этот вопрос может быть интересен другим людям.

+2

Пейджинговые @PeterCordes ... –

+1

Я попробовал оба, и не видел разницы в производительности (пробовал его на Core i7 2600) – Rotem

+1

@Rotem это возможно, это только лучше до Nehalem (т.е. на системах с SSE3 и SSSE3, но не SSE4.1), но это только предположение. –

ответ

6

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 (и заметим, что рассказ о типах памяти)

+0

Сколько людей все еще используют компьютер x86 без SSSE3? Если я смотрю статистику Steam (за все, что они стоят), почти 100% пользователей имеют SSE3, но только у 90% есть SSSE3? Действительно ли люди все еще используют P4 (или даже раньше)? Я думаю, вы упомянули в сообщении, которое вы все еще используете P4. –

+1

@Zboson: Большая часть этого предназначалась как исторический интерес, потому что это в основном не актуально. 10% пользователей без SSSE3, вероятно, в основном AMD. У меня никогда не было P4. У меня был P-MMX, затем несколько AMD Athlons, затем K8, затем Core2 (Merom), затем SnB. Обновление BIOS Intel заманило мою материнскую плату SnB, поэтому я снова использую свой Core2Duo E6600, пока не перестаю быть ленивым и решу, что я могу купить в Skylake mobo. Я видел, как P4 все еще используется на рабочем столе прошлым летом, я думаю, что это было, в квартире мой брат делился с парнем, который вообще не был компьютерным выродком (и имел консоль для игр). –

+0

AMD объясняет это, спасибо. Я не понимал, что AMD перешла с SSE3 (до бульдозера) прямо на AVX (бульдозер). AMD имела SSE4a, прежде чем он получил SSSE3. Я удивлен, что обновленный BIOS закрепил вашу системную плату SnB. У меня был 68-килобайтный процессор, тогда я решил изучать физику вместо comp sci, а следующий компьютер, который я купил, где я действительно знал, что такое процессор, был 2600k SnB :-) –