2013-04-04 4 views
2

Как мы видим здесь, «arm integer NEON operations cycles» и операции пополнения операций NEON, целые операции умножения не имеют определенного преимущества перед операциями умножения с плавающей запятой. Когда я преобразовал свой код с плавающей запятой в фиксированную точку, мне пришлось добавить дополнительную команду «shift» после инструкций умножения/деления с фиксированной точкой. Циклы, необходимые для программы, фактически увеличились из-за увеличения инструкций. Производительность моей программы ухудшилась из-за фиксированной точки. (14000-циклов для кода с плавающей точкой, 26000 циклов для кода с фиксированной точкой).Сравнение NEON с фиксированной точкой и фиксированное сравнение с операциями с плавающей запятой

Есть ли специальные инструкции, посвященные NEON для операций с фиксированной точкой (умножения и деления)? Я только нашел одну инструкцию, которая только что конвертирует Fixed -float и в противном случае. Есть ли эффективный способ написания программ с фиксированной точкой в ​​NEON?

Я написал следующий пример кода для кода с плавающей точкой.

VMUL Q14.F32,Q8.F32,Q2.F32 
    VMUL Q15.F32,Q8.F32,Q3.F32 
    VLD2 {Q10.F32,Q11.F32},[[email protected]],TwdStep 
    VLD2 {Q4.F32,Q5.F32},[[email protected]],fftSize 
    VMLA Q14.F32,Q9.F32,Q3.F32 
    VMLS Q15.F32,Q9.F32,Q2.F32 

Следующий код был преобразован в код с фиксированной точкой, вставив операции сдвига после инструкций VMUL A.

VMUL Q14.S32,Q8.S32,Q2.S32 
    VMUL Q15.S32,Q8.S32,Q3.S32 
    VLD2 {Q10.S32,Q11.S32},[[email protected]],TwdStep 
    VLD2 {Q4.S32,Q5.S32},[[email protected]],fftSize 
    VMLA Q14.S32,Q9.S32,Q3.S32 
    VMLS Q15.S32,Q9.S32,Q2.S32 

    VRSHR Q14.S32,Q14.S32,#12  ;Shift instructions to account for fixed point 
    VRSHR Q15.S32,Q15.S32,#12  ; 
+0

В эти дни с фиксированной точкой обычно имеет смысл только на процессорах, которые с плавающей точкой стимулированной, такие как нижний конец микроконтроллеры, и на процессорах с явной поддержкой фиксированной запятой (различные семейства DSP, некоторые SIMD архитектуры) , В противном случае просто используйте с плавающей запятой. –

+0

Вы можете получить преимущество, если по возможности комбинировать трубопроводы. Вы используете 32-битные значения или происходит ли SIMD? Только обычный ARM имеет «MLA», «MUL» и т. Д., Которые выполняют 32-битные значения. вы можете сделать одно плавающее вычисление в ядре NEON, а другое - с ARM. –

+0

@artlessnoise Я просто хотел увидеть возможность NEON.Doing параллельно, действительно помогает !! – Wolfrum

ответ

2

Vector Floating Point Instruction Set Quick Reference Card См для набора NEON инструкций. Не существует специальных инструкций с фиксированной точкой.

Я предлагаю вам прочитать blog.arm.com пост под названием Coding for NEON - Part 3: Matrix Multiplication/Фиксированная точка, он может дать вам некоторые идеи, чтобы попробовать вещи.

Он утверждает:

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

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

+0

В приведенном выше примере «использование меньших бит» имеет значение, в примере используется 32 бита для плавающей запятой, тогда как для фиксированной точки используется 16 бит. В моем случае я использовал 32 бита как для плавающей, так и для фиксированной точки. – Wolfrum

+0

@ Вольфрум такая хорошая вещь или плохая вещь? или голосом? – auselen