ARM и NEON могут работать параллельно?
Это со ссылкой на вопрос: реализация кода контрольной суммы для Neon в Intrinsics
Открытие подвопросов, указанных в ссылке, в виде отдельных вопросов. Поскольку много вопросов не следует задавать как часть единой темы.
В любом случае подходит к вопросу:
Могут ли ARM и NEON (говоря с точки зрения архитектуры arm cortex-a8) работать параллельно? Как мне этого добиться?
Может ли кто-нибудь указать мне или поделиться некоторыми примерами реализации (псевдокод / алгоритмы / код, а не теоретические документы или доклады о реализации), в которых совместно используются взаимодействия ARM-NEON? (реализации с внутренними или inline-asm подойдут.)
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. Влияет ли это на параллельное планирование инструкций, я не знаю, но это определенно то, что нужно остерегаться.