некоторые сомнения относительно циклов ARM NEON

Я написал неоновый код на ассемблере и стремился к максимальной оптимизации. Хотя задержка из-за конфликта регистров и конвейера уменьшена, разница только в 1 цикл, то есть до номера 70-0 после номера 69-0. почему это так, я не понял. вот мой пример кода

до оптимизации http://pulsar.webshaker.net/ccc/sample-6b7ba7c2 после оптимизации http://pulsar.webshaker.net/ccc/sample-d59091b4

у меня так много сомнений в калькуляторе пульсара. 1. n.16-0 1c d0: 1 здесь n означает что? 2. a.23-0 2c q6l: 1 VMLA.I16 q6, q9, D0 [2] подставка для чего? л: 1 значит? 23 - это количество циклов? 3. Под подсчетом времени подразумевается общее время выполнения кода? надеюсь, что кто-нибудь поможет мне разобраться с этими сомнениями ....


person Sri    schedule 13.06.2014    source источник
comment
Веб-страницу можно запустить с помощью переводчик Google, где легенда внизу пытается объяснить вещи, как это сделал Алессандро.   -  person artless noise    schedule 13.06.2014
comment
Спасибо. На самом деле я тоже пробовал использовать переводчик Google, но там он ничего не объяснил об этих вещах. Из-за этого только подхожу через stackoverflow.   -  person Sri    schedule 14.06.2014


Ответы (1)


Вот что я могу вспомнить об этом счетчике циклов:

«n» обозначает конвейер Neon, «a» обозначает конвейер ARM. Фактически вы смешиваете инструкции ARM и NEON.

Что касается "q6l: 1": q6l - это регистр, который заставляет текущие инструкции ждать, а 1 - это количество дополнительных полупериодов, необходимых для того, чтобы этот регистр / результат стал доступным для команды, следовательно, это количество полупериодов. инструкции надо дождаться его ввода. Я не уверен, но полагаю, что «q6l» - это нижняя часть регистра q6.

Число «23» в вашем примере - это номер цикла, в котором инструкция может начать выполнение.

Время подсчета не имеет ничего общего с вашим кодом. Время синтаксического анализа - это время, затрачиваемое инструментом на интерпретацию предоставленных вами инструкций. Время подсчета - это время, которое требуется инструменту для анализа ваших инструкций и предоставления информации о цикле.

Я объясню результаты подробнее, например:

n.18-0   1c n0 q10:8

«n» обозначает исполнительную единицу (n = неон, a = рука, v = vfp).

«18» - это номер цикла, в котором инструкция может начать выполнение.

«0» - это номер конвейера.

«1c» - это количество циклов выполнения инструкции. ОБРАТИТЕ ВНИМАНИЕ, что это отличается от количества циклов, необходимых до тех пор, пока результат инструкции не станет доступен для дальнейших инструкций.

«n0» - конвейер, заставляющий текущую инструкцию ожидать результата. n0 = неоновый трубопровод номер 0.

«q10» - это регистр, заставляющий инструкцию ожидать результата.

«8» относится ко времени, в течение которого инструкция должна ждать результатов. Если я правильно помню, это количество полупериодов.

Этот счетчик не учитывает тот факт, что компилятор может переупорядочить инструкции, то есть отложить инструкцию, ожидающую результата. Но если вы заставляете свой компилятор не переупорядочивать инструкции сборки, когда инструкции должны ждать результата, никакие другие инструкции не могут начать выполнение, даже если им не нужно ждать результата, поэтому это вызывает остановку выполнения, в которой ЦП не может выполнить никаких инструкций.

Более того, я бы не стал использовать этот тип счетчика для кода с циклами. Я предлагаю вам разбить код на разные части и оптимизировать каждый цикл отдельно.

person Alessandro Gaietta    schedule 13.06.2014
comment
a.22-0 2c VMLA.I16 q6, q10, D0 [3]. Вы говорите, что «а» означает руку, но здесь приведенная выше инструкция относится к неону, а не к руке, тогда как «а» ?? - person Sri; 14.06.2014
comment
Спасибо за ваш ответ. знаете ли вы, почему сайт pulsar.webshaker.net не поддерживает VMOV.I8 D0, # 8 (немедленное перемещение значения в неоновый регистр)? - person Sri; 14.06.2014