我有很多关于复数的计算(通常是一个包含一个由两个浮点组成的结构的数组来表示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)));
// ...
}
Run Code Online (Sandbox Code Playgroud)
p是这种数组:
typedef struct {
Int16 re;
Int16 im;
} Complex;
Run Code Online (Sandbox Code Playgroud)
我已经阅读了"ARM C语言扩展"的第12章,但在理解如何在此处加载和存储我的构造以进行计算时仍然存在问题.
使用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);
Run Code Online (Sandbox Code Playgroud)
对于上面的代码,clang 3.3生成
vld2.16 {d18, d19, d20, d21}, [r0]
vmul.i16 q8, q10, q10
vmla.i16 q8, q9, q9
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
892 次 |
| 最近记录: |