- PVSM.RU - https://www.pvsm.ru -

История команд одного процессора. Часть 1. Отличия ассемблерных инструкций lddqu и movdqu

История команд одного процессора. Часть 1. Отличия ассемблерных инструкций lddqu и movdqu
В не столь далеком 2000 году корпорация Intel представила на рынке микроархитектуру NetBurst [1] для процессоров Pentium 4. В 2004 году, когда появились процессоры на ядре Prescott, в наборе команд SSE3 была реализована команда LDDQU.

Впрочем, предназначалась она для одной области применения, а именно — кодирование видео и если в деталях:

Наибольшего объема вычислений при кодировании видео, как правило, требует механизм оценки движения (Motion Estimation [2] — ME), который сравнивает блоки текущего кадра с блоками предыдущего кадра и ищет наилучшее соответствие. При поиске наилучшего соответствия может использоваться множество метрик. Наиболее распространенной является L1 метрика — сумма абсолютных разностей. Механизм ME работает так, что загрузки блоков предыдущего кадра оказываются невыровненными, в то время как загрузки блоков текущего кадра выровнены. Из-за невыровненных загрузок возникают два вида задержек из за:

  • затрат на обработку доступа к невыровненным данным;
  • затрат из-за разделения линий кэш-памяти/cache line split.

Микроархитектура NetBurst не поддерживает микрооперации для загрузки 128-битных невыровненных данных. По этой причине команды для 128-битных невыровненных загрузок, такие как movups и movdqu, эмулируются в микрокоде с использованием двух 64-битных загрузок, результаты которых объединяются в 128-битный результат. В дополнение к затратам на эмуляцию невыровненные загрузки вызывают затраты на обработку разделенных строк кэш-памяти, если доступ выходит за 64-байтовую границу.
Чтобы решить проблему разделения строк кэш-памяти при 128-битных невыровненных загрузках, в набор команд SSE3 была добавлена команда lddqu. Эта команда загружает 32-байтовый блок, выровненный по 16-байтовой границе и извлекает 16 байтов, соответствующих невыровненному доступу. Поскольку команда загружает больше байтов, чем запрошено, накладываются определенные ограничения на использование. Команду lddqu не следует использовать в областях адресного пространства памяти с некешируемой памятью (Uncached — UC) и с объединенной записью (Write-Combining — USWC). Кроме того, из-за особенностей реализации команды lddqu ее не следует использовать в ситуациях, когда ожидается перенаправление записи на чтение. В ситуациях, когда выполняется только загрузка и не используются области адресного пространства памяти UC и USWC, команда lddqu может успешно заменить команды movdqu/movups/movupd.
Приведенный ниже код представляет собой пример использования новой команды. Обе последовательности кода аналогичны, за исключением того, что старая команда для невыровненной загрузки (movdqu) заменена на новую команду (lddqu). Если предположить, что 25 % невыровненных загрузок проходят через строку кэша-памяти, новая команда может повысить производительность механизма ME на 30 %. Кодировщики MPEG-4 продемонстрировали ускорение более чем на 10 %.

Механизм Motion Estimator без SSE3:
movdqa xmm0, <текущий кадр>
movdqu xmm1, <предыдущий кадр>
psadbw xmm0, xmm1
paddw xmm2, xmm0

Механизм Motion Estimator с SSE3:
movdqa xmm0, <текущий кадр>
lddqu xmm1, <предыдущий кадр>
psadbw xmm0, xmm1
paddw xmm2, xmm0

Больше деталей доступно по ссылке: download.intel.com/technology/itj/2004/volume08issue01/art01_microarchitecture/vol8iss1_art01.pdf [3]

А так же, найболее интересные обсуждения:

В итоге, можно сказать, что начиная с появления модели Intel Core 2 (это относится к микроархитектуре Core, появившейся в середине 2006 года, и процессорам Merom и более поздним) и для всех будущих моделей команда lddqu выполняет те же действия, что и команда movdqu.
Иными словами, если процессор поддерживает набор команд Supplemental Streaming SIMD Extensions 3 (SSSE3), то команда lddqu выполняет те же действия, что и команда movdqu. Если же процессор не поддерживает набор команд SSSE3, но поддерживает SSE3, то используйте команду lddqu (и не забудьте детали о типах используемой памяти).

И напоследок — по поводу патентов: обратите внимание на наличие патента с номером 6721866 [6] где так же описывается некоторые детали реализации и использования.

PS: Для справки обратите внимание на полезную статью, в которой собраны данные обо всех микроархитектурах Intel: en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures [7]
(в прочем как всегда — Википедия )

Автор: readmaxym


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/4873

Ссылки в тексте:

[1] NetBurst : http://en.wikipedia.org/wiki/NetBurst_%28microarchitecture%29

[2] Motion Estimation: http://en.wikipedia.org/wiki/Motion_estimation

[3] download.intel.com/technology/itj/2004/volume08issue01/art01_microarchitecture/vol8iss1_art01.pdf: http://download.intel.com/technology/itj/2004/volume08issue01/art01_microarchitecture/vol8iss1_art01.pdf

[4] software.intel.com/en-us/forums/showthread.php?t=56271: http://software.intel.com/en-us/forums/showthread.php?t=56271

[5] x264dev.multimedia.cx/archives/8: http://x264dev.multimedia.cx/archives/8

[6] 6721866: http://www.google.com/patents/US6721866

[7] en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures: http://en.wikipedia.org/wiki/List_of_Intel_CPU_microarchitectures