我有很多复数的计算(通常是一个数组,包含一个由两个浮点数组成的结构来表示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章,但在理解如何在这里加载和存储我的构造以进行计算方面仍然存在问题。
发布于 2014-02-18 23:58:41
使用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);对于上面的代码clang3.3生成
vld2.16 {d18, d19, d20, d21}, [r0]
vmul.i16 q8, q10, q10
vmla.i16 q8, q9, q9https://stackoverflow.com/questions/21867623
复制相似问题