Как мы видим здесь, «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 ;
В эти дни с фиксированной точкой обычно имеет смысл только на процессорах, которые с плавающей точкой стимулированной, такие как нижний конец микроконтроллеры, и на процессорах с явной поддержкой фиксированной запятой (различные семейства DSP, некоторые SIMD архитектуры) , В противном случае просто используйте с плавающей запятой. –
Вы можете получить преимущество, если по возможности комбинировать трубопроводы. Вы используете 32-битные значения или происходит ли SIMD? Только обычный ARM имеет «MLA», «MUL» и т. Д., Которые выполняют 32-битные значения. вы можете сделать одно плавающее вычисление в ядре NEON, а другое - с ARM. –
@artlessnoise Я просто хотел увидеть возможность NEON.Doing параллельно, действительно помогает !! – Wolfrum