ARM простаивает, пока NEON выполняет свою работу?

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

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

Вот функция контрольной суммы, которую я написал как часть NEON, размещенная в Stack Overflow: Реализация кода контрольной суммы для Neon в 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, и мы ждем этого результата (или так он выглядит)..

ПРИМЕЧАНИЕ:

  1. Говоря о коре-а8
  2. do_csum, как вы можете видеть из ссылки, закодирован с помощью встроенных функций.
  3. компиляция с использованием цепочки инструментов gnu
  4. Будет хорошо, если вы также возьмете многопоточность или любую другую концепцию, связанную или появившуюся на картинке, когда происходят эти интероперации.

Вопросы:

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

person nguns    schedule 19.10.2012    source источник
comment
Блоки ARM могут выполнять полезную работу параллельно с NEON. В качестве примера такой оптимизации предлагаю взглянуть на эту статью: cr.yp. в/highspeed/neoncrypto-20120320.pdf   -  person Marat Dukhan    schedule 19.10.2012
comment
Нам нужно увидеть фактические инструкции, чтобы иметь возможность сказать, что выполняется параллельно. Ваш код, оптимизированный для NEON, вероятно, представляет собой смесь инструкций NEON и не-NEON.   -  person Guy Sirton    schedule 19.10.2012
comment
Смотрите мой ответ, но вы должны смотреть на вещи на уровне инструкций, а не на уровне потоков или функций.   -  person Guy Sirton    schedule 19.10.2012
comment
Спасибо @Maratyszcza, эта ссылка действительно была полезной. Вот вопрос может быть глупым, но появляется ли концепция многопоточности/семафоров/спин-блокировок, в то время как ARM вызывает код для NEON?   -  person nguns    schedule 22.10.2012
comment
Параллельное выполнение инструкций на устройствах ARM и NEON не имеет ничего общего с многопоточностью. Это пример параллелизма на уровне инструкций — выполнение нескольких независимых инструкций в одном цикле. Почти все современные ЦП могут выполнять несколько инструкций за такт. Однако инструкции, выполняемые в одном и том же цикле, не так независимы для ЦП, как инструкции из разных потоков, и во многих случаях процессоры не могут распознать их независимость.   -  person Marat Dukhan    schedule 22.10.2012


Ответы (3)


введите здесь описание изображения

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

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

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

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

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

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

person Guy Sirton    schedule 19.10.2012
comment
NEON ALU не обязательно находятся в конце конвейера, и при этом они не обязательно имеют отдельные декодирование/отправку. Они есть в Cortex-A8, но во многих других реализациях они находятся в том же месте в конвейере, что и другие ALU, и совместно используют декодирование и отправку. (Все равно проголосовали, поскольку в вопросе указан Cortex-A8). - person Stephen Canon; 21.10.2012
comment
@StephenCanon: Спасибо ... Я пояснил это в своем ответе. - person Guy Sirton; 21.10.2012
comment
Спасибо. Вот вопрос может быть глупым, но входит ли в картину концепция многопоточности/семафоров/спин-блокировок/можно ли ее перетащить в картинку, пока ARM вызывает код для NEON? - person nguns; 22.10.2012
comment
@Asif Нет. Смотрите мой ответ ниже. - person auselen; 22.10.2012
comment
@Asif: такие вещи, как переключение контекста, занимают сотни циклов, поэтому на самом деле это не имеет значения. Теоретически вы можете ждать спин-блокировки при обработке инструкций NEON, однако вам нужно будет структурировать свой код таким образом. Все дело в наборе инструкций, считываемых процессором на самом низком уровне. - person Guy Sirton; 22.10.2012

В Application Level Programmers’ Model вы не можете различить блоки ARM и NEON.

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

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

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

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

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

person auselen    schedule 19.10.2012
comment
технически ядро ​​ARM не управляет блоком NEON, инструкции NEON просто обрабатываются позже по конвейеру. - person Guy Sirton; 19.10.2012
comment
Да, но в каком-то смысле вам нужно установить значения для регистров NEON unit invfp, верно? и вам тоже нужно их вернуть. даже когда неон выполняет загрузку, например, вы вызываете неоновые инструкции в цикле, все это с точки зрения программистов на уровне приложений довольно связано. - person auselen; 19.10.2012
comment
да, блок NEON не имеет инструкций по управлению потоком, поэтому он ограничен таким образом. Думаю, правильнее будет сказать, что ARM управляет потоком выполнения... - person Guy Sirton; 19.10.2012
comment
Спасибо @auselen, как бы я хотел принять несколько ответов на SO .. !!! А пока +1 ;) - person nguns; 22.10.2012

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 может выполнять за каждый такт до 2 инструкций. Если обе они являются независимыми операциями NEON, нет смысла помещать между ними инструкцию ARM. OTOH, если известно, что задержка VLD (загрузки) велика, можно разместить множество инструкций ARM между загрузкой и первым использованием загруженного значения. Но в каждом случае комбинированное использование должно планироваться заранее и чередоваться.

person Aki Suihkonen    schedule 19.10.2012
comment
Не помню, относится ли Cortex-A8 конкретно к техасской реализации или нет, но в техасских чипах также есть независимый блок DSP, который работает полностью параллельно arm/neon. - person Aki Suihkonen; 19.10.2012
comment
Cortex A8 — это IP от ARM. Микросхемы TI, такие как OMAP3730 и другие, включают DSP C64x. - person Guy Sirton; 19.10.2012
comment
Cortex-A8 может выполнять две целочисленные инструкции + две инструкции NEON (например, одну загрузку/сохранение и одну арифметическую) в течение одного цикла. Однако он может получить только две инструкции за цикл, но одна инструкция может занять более одного цикла. - person Guy Sirton; 19.10.2012