2013-02-14 6 views
2

У меня есть простой код asm, который загружает 12 квадранговых регистров NEON и имеет параллельную команду add add вместе с инструкцией по загрузке (для использования возможности двойной проблемы). Я проверил код здесь:Neon VLD потребляет больше циклов, чем ожидалось?

http://pulsar.webshaker.net/ccc/sample-d3a7fe78

Как можно видеть, код занимает около 13 циклов. Но когда я загружаю код на плате, инструкции загрузки, по-видимому, занимают более одного цикла на нагрузку, я проверял и выяснил, что VPADAL принимает 1 цикл, как указано, но VLD1 принимает более одного цикла. Почему это?

я позаботилась из следующих действий:

  1. Этот адрес 16 байт выравнивается.
  2. Обеспечили намек выравнивания в инструкции vld1.64 {d0, d1} [r0,:128]!
  3. Пробовал инструкцию преднагрузки pld [r0, #192], в тех местах, но, кажется, добавить к циклам вместо фактического уменьшения задержки.

Может кто-нибудь сказать мне, что я делаю неправильно, почему эта латентность?

Другие детали:

  • Со ссылкой на Cortex-a8
  • рычажного 2009q1 инструмент кросс-компилятор цепи
  • кодирование в сборке
+0

Означает ли это больше реальности? http://pulsar.webshaker.net/ccc/beta-sample-d3a7fe78 (используя симулятор «бета») –

+0

@AkiSuihkonen, как это возможно? VPADAL и VLD должны работать параллельно, не похоже на ссылку симулятора, которую вы давали, а также почему NEON приходится начинать так поздно? – nguns

+0

Вы ожидаете, что нагрузки будут завершены за один цикл? В зависимости от расстояния (l1, l2, dynamic ram) потребуется много циклов. Я считаю, что было бы очень полезно, если бы вы сначала произвели нагрузки, а затем добавили. – auselen

ответ

1

Ваш код выполняется гораздо медленнее, чем ожидалось, потому что как это написано в настоящее время, это создает идеальный шторм трубопроводов. На любом современном процессоре с конвейерной архитектурой инструкции могут выполняться за один цикл в идеальных условиях. Идеальными условиями являются то, что команда не ждет памяти и не имеет каких-либо зависимостей в регистре. То, как вы написали код, не позволяет задерживать чтение из памяти и делать следующую инструкцию зависимой от результатов чтения. Это вызывает худшую возможную производительность. Кроме того, я не уверен, почему вы накапливаете попарные добавления в несколько регистров. Попробуйте что-то вроде этого:

veor.u16 q12,q12,q12  @ clear accumulated sum 
top_of_loop: 
    vld1.u16 {q0,q1},[r0,:128]! 
    vld1.u16 {q2,q3},[r0,:128]! 
    vpadal.u16 q12,q0 
    vpadal.u16 q12,q1 
    vpadal.u16 q12,q2 
    vpadal.u16 q12,q3 
    vld1.u16 {q0,q1},[r0,:128]! 
    vld1.u16 {q2,q3},[r0,:128]! 
    vpadal.u16 q12,q0 
    vpadal.u16 q12,q1 
    vpadal.u16 q12,q2 
    vpadal.u16 q12,q3 
    subs r1,r1,#8 
    bne top_of_loop 

Эксперимент с различными инструкциями по загрузке перед выполнением добавлений. Дело в том, что вам нужно разрешить время для чтения, прежде чем вы сможете использовать целевой регистр.

Примечание. Использование Q4-Q7 является рискованным, поскольку они являются энергонезависимыми регистрами. На Android вы получите случайный мусор, появляющийся в них (особенно Q4).

+0

спасибо за ваш ответ, я проверил свой код на плате и, похоже, происходит срыв запросов на 64 байта (одна строка кеша в cortex-a8), то есть после четырех запросов загрузки в моем коде, но я не уверен в Причина пока. Таким образом, 'vpadal' сразу после запроса на загрузку' vld', похоже, не является проблемой. Я попробовал ваш код и мальчика .. !! киоски дали мне мини-сердечный приступ .. !! Проблема, использующая тот же регистр для накопления результата, приводит к тяжелой остановке, читает ответ @ auselen [здесь] (http://stackoverflow.com/questions/12932940/using-neon-multiply-accumulate-on-ios) – nguns

+2

Хорошо знать об использовании одного и того же регистра для накопления результата. Это позволит решить чередование нескольких регистров. Еще одно замечание - не использовать слишком много PLD в строке или вы также остановите чтение памяти, так как оно будет ждать, чтобы заполнить все эти запросы на чтение. Скорость памяти очень зависит от вашего оборудования. В последнее время я работал с Qualcomm MSM8074 с памятью DDR3, и производительность памяти впечатляет; стойки с инструкциями и стойки памяти примерно равны в этой системе. – BitBank