Ответ зависит от процессора 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