我有很多关于复数的计算(通常是一个包含两个浮点数的结构的数组来表示im和re;见下文),并希望用NEON C内在函数加速它们。如果你能给我一个如何加速这样的事情的例子,那将是非常棒的:
for(n = 0;n < 1024;n++,p++,ptemp++){ // get cir_abs, also find the biggest point (value and location).
abs_squared = (Uns32)(((Int32)(p->re)) * ((Int32)(p->re))
+ ((Int32)(p->im)) * ((Int32)(p->im)));
// ...
}
p是这种数组:
typedef struct {
Int16 re;
Int16 im;
} Complex;
我已经阅读了“ARM C语言扩展”的第12章,但在理解如何在此处加载和存储我的构造以进行计算时仍然存在问题。
答案 0 :(得分:5)
使用vld2*
内在函数在加载时将re
和im
拆分为不同的寄存器,然后单独处理它们,例如
Complex array[16];
const int16x8x2_t vec_complex = vld2q_s16((const int16_t*)array);
const int16x8_t vec_re = vec_complex.val[0];
const int16x8_t vec_im = vec_complex.val[1];
const int16x8_t vec_abssq = vmlaq_s16(vmulq_s16(vec_re, vec_re), vec_im, vec_im);
对于上面的代码,clang 3.3生成
vld2.16 {d18, d19, d20, d21}, [r0]
vmul.i16 q8, q10, q10
vmla.i16 q8, q9, q9