ARM и NEON могут работать параллельно?

Это относится к вопросу: реализация кода контрольной суммы для Neon в Intrinsics

Открытие подвопросов, перечисленных в ссылке, как отдельных вопросов. Поскольку несколько вопросов не следует задавать в рамках одной темы.

В любом случае, подходя к вопросу:

Могут ли ARM и NEON (если говорить об архитектуре arm cortex-a8) работать параллельно? Как я могу этого добиться?

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


person nguns    schedule 05.09.2012    source источник
comment
Краткий ответ: Да, если они не используют одну и ту же память. Синхронизация доступа к памяти очень медленная, и перемещение байтов из регистров NEON в регистры ARM снова происходит очень медленно. Что достаточно быстро, так это перевод регистров ARM в регистры NEON.   -  person Sam    schedule 05.09.2012
comment
Обратите внимание, что это только параллелизм на уровне инструкций   -  person Paul R    schedule 05.09.2012
comment
Также имейте в виду, что блок NEON имеет довольно длинный конвейер, а передача управления или регистров между вектором и блоком единиц и целыми блоками влечет за собой довольно большие штрафы.   -  person marko    schedule 05.09.2012


Ответы (1)


Ответ зависит от процессора ARM. Например, Cortex-A8 использует сопроцессор для реализации инструкций NEON и VFP, который подключается к ядру ARM через FIFO. Когда декодер инструкций обнаруживает инструкцию NEON или VFP, он просто помещает ее в FIFO. Сопроцессор NEON извлекает инструкции из FIFO и выполняет их. Сопроцессор NEON/VFP при этом немного отстает — на Cortext-A8 до 20 тактов или около того.

Обычно эта задержка не влияет на эту задержку, если только вы не попытаетесь передать данные обратно из сопроцессора NEON/VFP в основное ядро ​​ARM. (Не имеет большого значения, делаете ли вы это, перемещаясь из NEON/VPF в регистр ARM, или читая память с помощью инструкций ARM, которые недавно были записаны инструкциями NEON). В этом случае основное ядро ​​ARM останавливается до тех пор, пока ядро ​​NEON не опустошит FIFO, то есть до 20 циклов или около того.

Ядро ARM обычно может ставить инструкции NEON/VPF в очередь быстрее, чем сопроцессор NEON/VPF может их выполнять. Вы можете использовать это, чтобы оба ядра работали параллельно, подходящим чередованием ваших инструкций. Например, вставьте одну инструкцию ARM после каждого блока из двух или трех инструкций NEON. Или, может быть, две инструкции ARM, если вы также хотите использовать возможности ARM с двумя задачами. Для этого вам придется использовать встроенный ассемблер - если вы используете встроенные функции, точное планирование инструкций зависит от компилятора, и можно только догадываться, достаточно ли у него ума для их надлежащего чередования. Ваш код будет выглядеть примерно так

<neon instruction>
<neon instruction>
<neon instruction>
<arm instruction>
<arm instruction>
<neon instruction>
...

У меня нет под рукой образца кода, но если вы немного знакомы с ассемблером ARM, чередование инструкций не должно вызвать особых проблем. После того, как вы закончите, обязательно используйте профилировщик на уровне инструкций, чтобы убедиться, что все действительно работает так, как задумано. Вы не должны увидеть практически никакого времени, затрачиваемого на инструкции ARM.

Помните, что другие реализации ARMv7 могут реализовать NEON совершенно по-другому. Например, кажется, что Cortex A-9 переместил NEON ближе к ядру ARM и имеет гораздо более низкую пенатность при перемещении данных из NEON/VFP обратно в ARM. Влияет ли это на параллельное планирование инструкций, я не знаю, но на это определенно стоит обратить внимание.

person fgp    schedule 05.09.2012
comment
Спасибо @fgp, это было действительно очень хорошее объяснение. Отвечает на многие другие мои вопросы. Я был бы признателен, если бы кто-нибудь мог указать мне на некоторые реализации, использующие функции arm-neon с использованием встроенной сборки. Я не мог найти много в гугле. - person nguns; 06.09.2012