ARM сидит без дела, а NEON выполняет свои операции?

Может выглядеть так: ARM и NEON могут работать параллельно?, но его нет, у меня есть еще одна проблема (может быть, проблема с моим пониманием):

В стеке протоколов, когда мы вычисляем контрольную сумму, которая выполняется на GPP, я передаю эту задачу теперь NEON как часть функции:

Вот функция контрольной суммы, которую я написал как часть NEON, опубликованной в Stack Overflow: Реализация кода контрольной суммы для Neon in Intrinsics

Теперь предположим, что из linux эта функция вызывается,

ip_csum(){
  …
  …
  csum = do_csum(); //function call from arm
  …
  …
}


do_csum(){
  …
  …
  //NEON optimised code
  …
  …
  returns the final checksum to ip_csum/linux/ARM
}

в этом случае.. что происходит с ARM, когда NEON выполняет вычисления? ARM сидит без дела? или он переходит с другими операциями?

как вы можете видеть, do_csum вызывается, и мы ожидаем этого результата (или это то, как он выглядит).

Примечание:

  • Говоря в терминах cortex-a8
  • do_csum, как вы можете видеть по ссылке, кодируется с помощью встроенных функций
  • компиляция с использованием цепочки инструментов gnu
  • Будет хорошо, если вы также возьмете Multi-threading или любую другую концепцию, вовлеченную или попадающую в картину, когда происходят эти межоперационные операции.

Вопросы:

  • Разве ARM сидит без дела, а NEON выполняет свои операции? (в данном конкретном случае)
  • Или он откладывает этот текущий код, связанный с ip_csum, и обрабатывает другой процесс/поток до тех пор, пока NEON не будет выполнен? (Я почти тупой, что происходит здесь).
  • Если он сидит без дела, как мы можем заставить ARM работать над чем-то другим до тех пор, пока NEON не будет выполнен?

Ответ 1

enter image description here

(Изображение из TI Wiki Cortex A8)

ARM (или скорее Integer Pipeline) не сидит без дела, пока обрабатываются команды NEON. В Cortex A8 NEON находится в "конце" конвейера процессора, инструкции проходят через конвейер и, если они являются инструкциями ARM, они выполняются в "начале" конвейера, а команды NEON выполняются в конце. Каждый такт выполняет команду вниз по конвейеру.

Вот несколько советов о том, как читать диаграмму выше:

  • Каждый цикл, если возможно, процессор извлекает пару команд (две инструкции).
  • Извлечение осуществляется конвейерно, поэтому для передачи инструкций в блок декодирования требуется 3 цикла.
  • Для декодирования команды требуется 5 циклов (D0-D4). Опять же, это все конвейеры, поэтому это влияет на задержку, но не на пропускную способность. По мере возможности, всевозможные инструкции продолжают протекать по трубопроводу.
  • Теперь мы доходим до части загрузки/загрузки. Инструкции NEON проходят через этот этап (но они делают это, пока могут выполняться другие команды).
  • Мы получаем часть NEON, если команда, полученная 13 циклов назад, была инструкцией NEON, теперь она декодируется и выполняется в конвейере NEON.
  • Пока это происходит, целые инструкции, которые после этой команды могут выполнять одновременно в конвейере целых чисел.
  • Конвейер - довольно сложный зверь, некоторые инструкции многозадачны, некоторые из них имеют зависимости и будут останавливаться, если эти зависимости не будут выполнены. Другие события, такие как ветки, будут очищать конвейер.

Если вы выполняете последовательность, которая представляет собой 100% инструкции NEON (что довольно редко, так как обычно есть некоторые регистры ARM, поток управления и т.д.), тогда существует некоторый период, когда цельный цикл ничего не делает полезно. В большинстве случаев код будет выполняться одновременно, по крайней мере, некоторое время, в то время как умный код может максимизировать производительность с помощью правильного сочетания команд.

Этот онлайн-инструмент Счетчик циклов для Cortex A8 отлично подходит для анализа производительности вашего ассемблерного кода и дает информацию о том, что выполняется в каких подразделениях и что застопоривается.

Ответ 2

ARM не "простаивает", а операции NEON выполняются, но контролирует их.
Чтобы полностью использовать мощность обоих блоков, можно тщательно спланировать чередующуюся последовательность операций:

loop:
SUBS r0,r0,r1  ; // ARM operation
addpq.16 q0,q0,q1  ; NEON operation
LDR r0, [r1, r2 LSL #2];   // ARM operation
vld1.32 d0, [r1]!  ; // NEON operation using ARM register
bne loop;         // ARM operation controlling the flow of both units...

ARM cortex-A8 может выполнять в каждом такте до двух инструкций. Если оба они являются независимыми операциями NEON, использовать инструкцию ARM между ними бесполезно. OTOH, если известно, что латентность VLD (нагрузка) велика, можно разместить много команд ARM между нагрузкой и первым использованием загруженного значения. Но в каждом случае комбинированное использование должно быть запланировано заранее и чередуется.

Ответ 3

В Application Level Programmers’ Model вы не можете отличить устройства ARM и NEON.

Хотя NEON является отдельным аппаратным блоком (который доступен как опция для серии Cortex-A процессоры), это ядро ​​ARM, которое жестко управляет им. Это не отдельный DSP, который вы можете обменивать асинхронно.

Вы можете написать лучший код, полностью используя конвейеры на обоих устройствах, но это не то же самое, что иметь отдельный ядро.

Модуль NEON существует, поскольку он может выполнять некоторые операции (SIMD) намного быстрее, чем блок ARM на низкой частоте.

Это как иметь друга, который хорош в математике, всякий раз, когда у вас есть трудный вопрос, вы можете спросить его. В ожидании ответа вы можете сделать некоторые мелочи, например, если это ответ, я должен это сделать или если не делать это, но если вы зависите от этого ответа, продолжайте ждать ответа, прежде чем идти дальше. Вы можете рассчитать ответ самостоятельно, но он будет намного быстрее, даже если время общения между вами двумя, по сравнению с тем, что вы делаете всю математику самостоятельно. Я думаю, вы можете даже расширить эту аналогию, например: "вам также нужно купить обед для этого друга (потребление энергии), но во многих случаях это того стоит".

Любой, кто говорит, что ядро ​​ARM может делать другие вещи, в то время как NEON core работает над своим материалом, говорит о уровне инструкций parallelism не что-то вроде уровень задачи parallelism.