ARM Neon Assembler - странная проблема конвейера - PullRequest
3 голосов
/ 15 марта 2012

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 марта 2012

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

2 голосов
/ 19 марта 2012

На самом деле это немного сложнее. БитБанк прав, НЕОН должен ждать D4.

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

vld1.64 d4, [r7, :64]

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

2 голосов
/ 18 марта 2012

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

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

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

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

...