AVX VMOVDQA медленнее двух SSE MOVDQA?

Пока я работал над своим быстрым циклом ADD (Ускорение цикла ADD на ассемблере x64), я тестировал доступ к памяти с помощью SSE и Инструкции AVX. Чтобы добавить, мне нужно прочитать два ввода и произвести один вывод. Поэтому я написал фиктивную процедуру, которая считывает два значения x64 в регистры и записывает одно обратно в память, не выполняя никаких действий. Это, конечно, бесполезно, я делал это только для тестирования.

Я использую развернутый цикл, который обрабатывает 64 байта за цикл. Он состоит из 8 блоков:

mov rax, QWORD PTR [rdx+r11*8-64]
mov r10, QWORD PTR [r8+r11*8-64]
mov QWORD PTR [rcx+r11*8-64], rax

Затем я обновил его до SSE2. Сейчас я использую 4 таких блока:

movdqa xmm0, XMMWORD PTR [rdx+r11*8-64]
movdqa xmm1, XMMWORD PTR [r8+r11*8-64]
movdqa XMMWORD PTR [rcx+r11*8-64], xmm0

Позже я использовал AVX (256 бит на регистр). У меня есть 2 таких блока:

vmovdqa ymm0, YMMWORD PTR [rdx+r11*8-64]
vmovdqa ymm1, YMMWORD PTR [r8+r11*8-64]
vmovdqa YMMWORD PTR [rcx+r11*8-64], ymm0

Пока все не так уж и зрелищно. Что интересно, так это результат бенчмаркинга: когда я запускаю три разных подхода на 1k + 1k = 1k 64-битных слов (т. Е. Два раза по 8 КБ на входе и один раз на 8 КБ на выходе), я получаю странные результаты. Каждый из следующих моментов времени предназначен для обработки двукратного ввода 64 байта в 64 байта вывода.

  • Метод регистра x64 работает примерно с 15 циклами / 64 байта.
  • Метод SSE2 работает примерно с 8,5 циклами / 64 байта.
  • Метод AVX работает примерно с 9 циклами / 64 байта.

У меня вопрос: почему метод AVX работает медленнее (хотя и не намного), чем метод SSE2? Я ожидал, что будет как минимум на уровне. Стоит ли использовать регистры YMM так много дополнительного времени? Память была выровнена (иначе вы получите GPF).

У кого-нибудь есть объяснение этому?


person cxxl    schedule 20.12.2012    source источник
comment
Мне кажется, я помню, что в современных архитектурах доступ к памяти AVX в некоторых случаях разбивается на 2 отдельных 128-битных доступа. Возможно, это то, с чем вы здесь столкнетесь. Настоящие преимущества AVX проявляются тогда, когда вы начинаете выполнять фактические вычисления, поскольку, очевидно, вы можете выполнять в два раза больше параллельных операций, чем при использовании SSE.   -  person Jason R    schedule 20.12.2012
comment
Ах, интересно. У вас есть указатель на это? Быстрый поиск нашел это, но они утверждают, что путь к памяти полностью 256-битный: ‹lostcircuits.com/mambo//  -  person cxxl    schedule 20.12.2012
comment
Также будьте осторожны при смешивании устаревших (не VEX) инструкций SSE с инструкциями AVX - не видя остальной части кода тестирования, неясно, актуально ли это, но вам, вероятно, все равно следует знать об этом: software.intel.com/en-us/articles/   -  person Paul R    schedule 20.12.2012
comment
Мне не очень нравятся ваши 8 множителей в версиях SSE и AVX, вам нужно будет использовать 16 и 32 (но вы не можете этого сделать при адресации) и, конечно, запускайте цикл меньше раз. Правильно ли учтено это в вашем тестовом коде?   -  person Jester    schedule 20.12.2012
comment
@Paul R: Спасибо за комментарий, но штрафы выплачиваются при переключении с одного набора инструкций на другой. Но весь мой цикл AVX использует только AVX и обычные инструкции, без SSE / FP.   -  person cxxl    schedule 21.12.2012
comment
Нет проблем - я просто хотел убедиться, что у вас нет устаревших инструкций SSE в вашем тестовом коде AVX.   -  person Paul R    schedule 21.12.2012


Ответы (1)


В Sandybridge / Ivybridge загрузка и сохранение AVX 256b разбиваются на две операции по 128b [как отмечает Питер Кордес, это не совсем микропроцессоры, но для операции по очистке порта требуется два цикла] в исполнительных модулях загрузки / сохранения, поэтому нет причин ожидать, что версия, использующая эти инструкции, будет намного быстрее.

Почему медленнее? На ум приходят две возможности:

  • для адресации по основанию + индексу + смещению задержка нагрузки 128b составляет 6 циклов, тогда как задержка нагрузки 256b составляет 7 циклов (Таблица 2-8 в Руководстве по оптимизации Intel). Хотя ваш тест должен быть связан с пропускной способностью, а не задержкой, более длительная задержка означает, что процессору требуется больше времени для восстановления после любых сбоев (пузырей конвейера, пропусков прогнозов, прерывания обслуживания или ...), что имеет некоторое влияние.

  • в 11.6.2 того же документа Intel предполагает, что штраф за пересечение строк и страниц кэша может быть больше для загрузок 256b, чем для загрузок 128b. Если ваши загрузки не выровнены по 32 байтам, это также может объяснить замедление, которое вы наблюдаете при использовании операций загрузки / сохранения 256b:

В примере 11-12 показаны две реализации SAXPY с невыровненными адресами. Альтернатива 1 использует 32-байтовые загрузки, а альтернатива 2 использует 16-байтовые загрузки. Эти образцы кода выполняются с двумя исходными буферами, src1, src2, со смещением 4 байта от 32-байтового выравнивания и целевым буфером, DST, который выровнен по 32 байта. Использование двух 16-байтовых операций с памятью вместо 32-байтовых операций доступа к памяти выполняется быстрее.

person Stephen Canon    schedule 25.12.2012
comment
Обратите внимание, что это не относится к Haswell, который был выпущен с тех пор, как я изначально написал этот ответ. - person Stephen Canon; 16.09.2013
comment
Это не 2 мупа, но для выполнения обеих половин в исполнительном блоке требуется 2 цикла. AGU требуется только в первом цикле и является бесплатным (например, для вычисления адреса магазина) во втором цикле, поэтому разработчики SnB / IvB не сочли необходимым включать отдельный порт адреса магазина. У Haswell есть один, потому что он может выполнять 256 байт передач за один цикл. В любом случае, разница между 1 мкопом или нет заключается в пропускной способности конвейера 4 мкоп / цикл. - person Peter Cordes; 03.07.2015
comment
Невыровненные нагрузки / хранилища не могут быть проблемой, потому что OP использовал vmovdqa, что приводит к сбоям в невыровненных. Однако включение этого абзаца все же делает ответ лучше. - person Peter Cordes; 06.02.2016