У меня есть простой код asm, который загружает 12 квадранговых регистров NEON и имеет параллельную команду add add вместе с инструкцией по загрузке (для использования возможности двойной проблемы). Я проверил код здесь:Neon VLD потребляет больше циклов, чем ожидалось?
http://pulsar.webshaker.net/ccc/sample-d3a7fe78
Как можно видеть, код занимает около 13 циклов. Но когда я загружаю код на плате, инструкции загрузки, по-видимому, занимают более одного цикла на нагрузку, я проверял и выяснил, что VPADAL принимает 1 цикл, как указано, но VLD1 принимает более одного цикла. Почему это?
я позаботилась из следующих действий:
- Этот адрес 16 байт выравнивается.
- Обеспечили намек выравнивания в инструкции
vld1.64 {d0, d1} [r0,:128]!
- Пробовал инструкцию преднагрузки
pld [r0, #192]
, в тех местах, но, кажется, добавить к циклам вместо фактического уменьшения задержки.
Может кто-нибудь сказать мне, что я делаю неправильно, почему эта латентность?
Другие детали:
- Со ссылкой на Cortex-a8
- рычажного 2009q1 инструмент кросс-компилятор цепи
- кодирование в сборке
Означает ли это больше реальности? http://pulsar.webshaker.net/ccc/beta-sample-d3a7fe78 (используя симулятор «бета») –
@AkiSuihkonen, как это возможно? VPADAL и VLD должны работать параллельно, не похоже на ссылку симулятора, которую вы давали, а также почему NEON приходится начинать так поздно? – nguns
Вы ожидаете, что нагрузки будут завершены за один цикл? В зависимости от расстояния (l1, l2, dynamic ram) потребуется много циклов. Я считаю, что было бы очень полезно, если бы вы сначала произвели нагрузки, а затем добавили. – auselen