Вопрос:

Производительность неустановленной загрузки / хранения SIMD на aarch64

alignment simd neon arm64

529 просмотра

2 ответа

6847 Репутация автора

Более старый ответ указывает, что aarch64 поддерживает неглавные чтения / записи и упоминает о стоимости выполнения, но неясно, отвечает ли ответ только на операции ALU или SIMD (128-битный регистр).

Относительно выровненных 128-разрядных загрузок и хранилищ NEON, насколько медленнее (если вообще) являются неуравновешенными 128-разрядными загрузками NEON и магазинами на aarch64?

Имеются ли отдельные инструкции для неуравновешенных нагрузок и хранилищ SIMD (как в случае с SSE2) или являются ли выровненные по значению нагрузки / хранятся те же инструкции, что и потенциально-неуравновешенные нагрузки / хранилища?

Автор: hsivonen Источник Размещён: 16.08.2017 01:11

Ответы (2)


2 плюса

332 Репутация автора

Решение

В соответствии с Руководством по оптимизации программного обеспечения Cortex-A57 в разделе 4.6 «Загрузка / сохранение хранилища» говорится:

Архитектура ARMv8-A позволяет произвольно выровнять множество типов загрузки и хранения. Процессор Cortex-A57 обрабатывает большинство несвязанных доступов без штрафов за производительность. Однако есть случаи, которые уменьшают пропускную способность или требуют дополнительной задержки, как описано ниже:

  • Операции загрузки, которые пересекают границу кеш-линии (64-байт)
  • Храните операции, которые пересекают границу по 16 байт

Это может зависеть от процессора, который вы используете, не по порядку (A57, A72, A-72, A-75) или в порядке (A-35, A-53, A-55). Я не нашел никакого руководства по оптимизации для процессоров in-order, однако у них есть счетчик производительности оборудования, который вы можете использовать для проверки того, влияет ли количество невыложенных инструкций на производительность:

    0xOF_UNALIGNED_LDST_RETIRED Unaligned load-store

Это можно использовать с perfинструментом.

Специальных инструкций по негласному доступу в AArch64 нет.

Автор: Guillermo Размещён: 29.08.2017 11:36

0 плюса

4784 Репутация автора

Если загрузка / хранилище необходимо разделить или пересечь линию кэша, требуется как минимум один дополнительный цикл.

Существуют исчерпывающие таблицы, которые определяют количество циклов, необходимых для различных выравниваний и номеров регистров для Cortex-A8 (in-order) и Cortex-A9 (частично OoO). Например, vld1с одним регистром имеет штраф в 1 цикл для неравномерного доступа по сравнению с 64-разрядным доступом.

Cortex-A55 (in-order) выполняет до 64-разрядных нагрузок и 128-битных магазинов, и, соответственно, в разделе 3.3 его руководства по оптимизации говорится, что 1-циклное наказание возникает за:

• Операции загрузки, которые пересекают 64-битную границу.
• 128-битные операции хранения, которые пересекают 128-битную границу

Cortex-A75 (OoO) имеет штрафы в разделе 5.4 своего руководства по оптимизации для:

• Операции загрузки, пересекающие 64-битную границу.
• В AArch64 все магазины, которые пересекают 128-битную границу.
• В AArch32 все магазины, которые пересекают 64-битную границу.

И как в ответе Гильермо, A57 (OoO) имеет штрафы за:

• Операции загрузки, которые пересекают границу кэша (64 байта).
• Храните операции, пересекающие границу [128 бит]

Я несколько скептически отношусь к тому, что A57 не имеет штрафа за пересечение 64-битных границ, учитывая, что A55 и A75. Все они имеют 64-байтные строки кэша; все они должны иметь штрафы за переходы кэш-линии. Наконец, обратите внимание, что существует непредсказуемое поведение для перекрестных страниц с разделенным доступом .

Из некоторого грубого тестирования (без перманентных счетчиков) с Cavium ThunderX, похоже, что он ближе к штрафу за 2 цикла, но это может быть аддитивным эффектом, связанным с неосновными нагрузками и магазинами в цикле.


Инструкции AArch64 NEON не различают выровненный и не выровненный (см., Например, LD1 ). Для AArch32 NEON выравнивание задается статически в адресации ( VLDn ):

vld1.32 {d16-d17}, [r0]    ; no alignment
vld1.32 {d16-d17}, [r0@64] ; 64-bit aligned
vld1.32 {d16-d17}, [r0:64] ; 64 bit-aligned, used by GAS to avoid comment ambiguity

Я не знаю, работает ли выравниваемый доступ без квалификаторов выравнивания, чем доступ с квалификаторами выравнивания на последних чипах, запущенных в режиме AArch32. В некотором роде старая документация от ARM поощряет использование квалификаторов, когда это возможно. (Intel уточнил свои чипы таким образом, что неравнозначные и выровненные ходы выполняют то же самое, когда адрес выровнен по сравнению.)

Если вы используете intrinsics, MSVC имеет _ex-выполненные варианты, которые принимают выравнивание. Надежный способ заставить GCC испускать квалификатор выравнивания __builtin_assume_aligned.

// MSVC
vld1q_u16_ex(addr, 64);
// GCC:
addr = (uint16_t*)__builtin_assume_aligned(addr, 8);
vld1q_u16(addr);
Автор: ZachB Размещён: 11.11.2018 02:09
Вопросы из категории :
32x32