Ускоренная целочисленная загрузка SSE без привязки, которая используется редко

Я хотел бы узнать больше о _mm_lddqu_si128intrinsic (инструкция lddqu, начиная с SSE3), особенно по сравнению с _mm_loadu_si128 intrinsic (инструкция movdqu после SSE2).

Я обнаружил _mm_lddqu_si128 только сегодня. Внутреннее руководство Intel говорит

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

и говорится, что это

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

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

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


person Z boson    schedule 14.07.2016    source источник
comment
Я попробовал оба и не увидел разницы в производительности (пробовал на Core i7 2600)   -  person Rotem    schedule 14.07.2016
comment
@Rotem, возможно, это лучше до Nehalem (т.е. в системах с SSE3 и SSSE3, но не SSE4.1), но это только предположение.   -  person Z boson    schedule 14.07.2016
comment
Я понимаю, что мог бы прочитать руководство Intel, чтобы найти ответ, но я думаю, что этот вопрос может быть интересен другим людям. Я проголосовал за этот вопрос, но, пожалуйста, не давайте здесь тему ...   -  person Cody Gray    schedule 14.07.2016
comment
@harold: нет, только Prescott P4, а не Merom.   -  person Peter Cordes    schedule 14.07.2016
comment
Не точно дубликат, но мой ответ на новый вопрос охватывает это и многое другое. Они должны быть как-то связаны друг с другом, и я думаю, что это дублированные работы. (Я мог бы отредактировать их оба со ссылками на друг друга.) Забавно, что примерно через 1,5 года я написал в основном тот же ответ о версии AVX 256b.   -  person Peter Cordes    schedule 03.12.2017


Ответы (1)


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
comment
Сколько людей все еще используют компьютер x86 без SSSE3? Если я посмотрю на статистику Steam (сколько бы она ни стоила), почти 100% пользователей имеют SSE3, но только 90% имеют SSSE3? Неужели люди все еще используют P4 (или даже раньше)? Я думаю, что вы упомянули в сообщении, что все еще используете P4. - person Z boson; 18.07.2016
comment
@Zboson: Большая часть этого была задумана как исторический интерес, потому что в основном это еще не актуально. 10% пользователей без SSSE3, вероятно, в основном AMD. У меня никогда не было P4. У меня был P-MMX, затем несколько AMD Athlons, затем K8, затем Core2 (Merom), затем SnB. Обновление BIOS от Intel заблокировало мою материнскую плату SnB, поэтому я снова использую свой Core2Duo E6600, пока не перестану лениться и не решу, какой Skylake mobo я хочу купить. Прошлым летом я действительно видел, как P4 все еще использовался на настольном компьютере, думаю, это было в квартире, которую мой брат делил с парнем, который вообще не был компьютерным фанатом (и у него была игровая консоль). - person Peter Cordes; 18.07.2016
comment
AMD объясняет это, спасибо. Я не понимал, что AMD перескочила с SSE3 (до бульдозера) прямо на AVX (бульдозер). У AMD был SSE4a до SSSE3. Я удивлен, что обновленный BIOS заблокировал вашу материнскую плату SnB. У меня был процессор 68k, тогда я решил изучать физику вместо comp sci, и следующий компьютер, который я купил, где я действительно знал, что это за процессор, был 2600k SnB :-) - person Z boson; 18.07.2016
comment
@Zboson: Да, я тоже был удивлен и очень разочарован тем, что Intel оставила опасное обновление BIOS для своих материнских плат DZ68DB. на странице загрузки без предупреждения за все эти годы. Я обновился, не читая дальше, пытаясь понять, улучшат ли они работу графических драйверов Linux. Думаю, много лет назад я видел эти предупреждения и не обновлялся, но забыл. Хех, я всегда был фанатом ЦП. Еще до того, как я хорошо знал ASM, я читал новостные статьи о том, как они работают и что работает быстрее. Большой сюрприз: P - person Peter Cordes; 18.07.2016
comment
Если 10% пользователей без SSSE3 - это AMD, я предполагаю, что у них есть SSE4a (микроархитектура Барселоны). Я бы предположил, что lddqu реализован так же, как movdqu. В этом случае lddqu является устаревшим для всех практических целей. Теперь я понимаю, почему базой становится SSE3, а не SSSE3. Вероятно, 99% пользователей Intel имеют SSSE3, но многие пользователи AMD нет. - person Z boson; 18.07.2016
comment
Мне кажется странным, что AMD реализовала SSE4a до SSSE3. Интересно, зачем они это сделали. Это раздражает. - person Z boson; 18.07.2016
comment
@Zboson: Антиконкурентная практика Intel, заключающаяся в неразглашении подробностей с достаточным количеством потенциальных клиентов. время для AMD реализовать их, вероятно, является основной причиной. Другие махинации с x86, такие как FMA4 против FMA3, почти полностью виноваты Intel, так что я предполагаю, что это тоже. - person Peter Cordes; 18.07.2016
comment
Уилл Intel немного навредит себе этим, потому что это означает, что SSE3 станет базовым вместо SSSE3. Думаю, именно поэтому правительство не поощряет антиконкурентную практику. Это пример дилеммы заключенного, хотя некоторые не согласен. - person Z boson; 18.07.2016
comment
@Zboson: наличие в качестве базовой линии только SSE3 вместо SSSE3 не особо вредит Intel больше, чем AMD. Это вредит клиентам Intel, но мы по-прежнему собираемся покупать их процессоры. Во всяком случае, подобная чушь приносит пользу Intel, потому что разработчики с большей вероятностью потратят время на ускорение только для процессоров Intel, чем только для процессоров AMD. например даже AMD отказалась от XOP для будущих процессоров. (Хотелось бы, чтобы Intel приняла его; vpperm перестановка двух байтов заполняет так много пробелов ...) И тогда некоторое программное обеспечение будет даже быстрее на Intel, чем AMD, увеличивая разрыв в производительности. - person Peter Cordes; 18.07.2016
comment
@Zboson: Я только что понял, что сделал неявное предположение, что нанесение ущерба архитектуре x86 подобным дерьмом не повредит Intel. На самом деле возможно, что ARM или что-то еще будет легче вытеснить x86, но в долгосрочной перспективе основное влияние будет менее компактным машинным кодом и, возможно, ограничениями будущей расширяемости (хотя пространство для кодирования VEX все еще имеет массу места; в настоящее время только 1 / 64-е использование, IIRC.) Поэтому я сомневаюсь, что это сильно повлияет на долгосрочную конкурентоспособность x86. Люди, для которых он создает больше работы (разработчики), не являются теми, кто принимает решения о покупке HW. - person Peter Cordes; 18.07.2016
comment
Кстати, есть кодированный VEX vlddqu, который также работает с 32-байтовой шириной. Иди разберись. Я не могу сказать, намеренно ли это или просто результат какой-то глупой проводки, которая в равной степени продвинула все устаревшие SSE на VEX без учета полезности. То же самое относится к vpalignr/vpsrldq/vpslldq. Возможно, это упрощает их сокращение k-map для декодера команд. - person Mysticial; 03.08.2016
comment
@Mysticial: что еще хуже, есть _mm256_lddqu_si256 внутреннее и люди действительно используют его / facepalm. IDK, почему они потрудились создать аппаратное обеспечение для перемешивания для vpalignr ymm; согласился с тем, что у него нет вариантов использования с этой дурацкой семантикой. Однако есть некоторые инструкции, которые не имеют 256-битных форм, только SSE и AVX-128: movhps, pextr* / pinsr*, PCMPISTRM (и другие строковые insns SSE4.2), MASKMOVDQU (не с большей степенью детализации VPMASKMOVD/Q). Также AES-NI и PCLMULQDQ. Расшифровать транзисторы все еще возможно. - person Peter Cordes; 03.08.2016
comment
Так что lddqu наконец умирает в AVX512. vpalignr превращается в valignr и поступает правильно. Но vpsrldq/vpslldq по-прежнему меняют полосу движения. Мне любопытно, каковы варианты использования для 128-битного сдвига в полосе движения. На этом этапе его уже нельзя хранить бесплатно. Это не подмножество других инструкций до перестановки байтов Cannonlake. (Хотя я полагаю, что это можно сделать дешево, если вы немного обобщите аппаратное обеспечение valign.) - person Mysticial; 03.08.2016