2012-03-15 3 views
3

Я пытаюсь увеличить производительность фрагмента кода, написанного на ARM Assembler, используя инструкции Neon.ARM Neon Assembler - странный вопрос о трубопроводе

Для тестирования и расчета я использую этот калькулятор: http://pulsar.webshaker.net/ccc/sample-706454b3

Я заметил, что в строке «n.34-0 1c n0» вдруг блок Неон, кажется, придется ждать 10 циклов (?). Что может быть причиной этого или это просто ошибка в калькуляторе?

Также мне нужна общая информация о том, как улучшить производительность в ARM/Neon Assembler.

Цель - ARM Cortex-A9. Для компиляции я использую новейший андроид-ndk с встроенным ассемблером. Спасибо.

ответ

2

На самом деле это немного больше Complexe. BitBank Правильно, NEON должен ждать D4.

Но вам нужно ждать 10 циклов, потому что у Neon есть очередь загрузки/хранения. И очередь заполнена другой инструкцией перед

vld1.64 d4, [r7, :64] 

Так что, когда вам нужно Д4, вы должны ждать выполнения этой инструкции , но чтобы выполнить эту команду необходимо выполнить все предыдущие инструкции Load/магазин толкнули в очередь загрузки/хранения NEON.

3

Модуль NEON должен ждать этой инструкции, потому что вы ссылаетесь на регистр (D4), который был загружен в предыдущую инструкцию NEON (n.33-0 1c n0). Нагрузки не являются мгновенными, и из-за конвейерной обработки существует задержка в доступности данных, даже если она исходит из кеша. Вам необходимо изменить порядок своих инструкций ARM и NEON, чтобы не пытаться использовать регистры сразу после их загрузки, иначе вы закончите расточительные циклы (конвейеры).

+1

Эти опасности всего 1 ~ 2 цикла, если кэш попал. В этом случае это нечто другое. –

1

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

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

Кроме того, есть слишком много ldrb's. Байт доступа на ARM также почти грех.

Я предлагаю вам полностью переписать свой код в C первого, с 32-битной только к памяти, а затем оценить его, означает ли быть для NEON вообще,

+0

Благодарим за комментарий. Мне нужен только один байт, поэтому, если бы я сразу прочитал 32Bit, мне нужно снова и снова сменить Shift/ANd, и это будет медленнее. Код уже существует как C & ARM Assembler, и мне нужно проверить, могу ли я ускорить его с помощью инструкции Neon. Теоретически это должно быть на 30-40% быстрее. Какие операции можно выполнять параллельно. ARM арифметика и Neon load/store, но не (?) Неоновая арифметика и ARM Load/Store? – HectorLector

+0

Вы не поверите: 32-битное чтение + маскирование намного быстрее, чем чтение байта. –

+0

Забудьте о параллельной обработке. Перемещение значений из Neon в ARM также приводит к тому, что поток флеш-трасс тратит 11 циклов. ARM должен служить как блок управления, в то время как Neon выполняет всю работу. –