Optimization 使用NEON内部函数的代码性能较慢

Optimization 使用NEON内部函数的代码性能较慢,optimization,arm,intrinsics,neon,armv8,Optimization,Arm,Intrinsics,Neon,Armv8,我正在尝试使用NEON Intrinsic重新实现苹果的功能(我正在将我的DSP代码移植到Android上): void vDSP_zvma(常数DSPSplitComplex*\uuu A、vDSP_Stride\uu IA、常数DSPSplitComplex*\uu B、, vDSP步长IB,常数DSPSplitComplex*\uC,vDSP步长IC, 常数DSPSplitComplex*\uuuuu D、vDSP\u步长\uuuu ID、vDSP\u长度\uu N){ vDSP_长度n=

我正在尝试使用NEON Intrinsic重新实现苹果的功能(我正在将我的DSP代码移植到Android上):

void vDSP_zvma(常数DSPSplitComplex*\uuu A、vDSP_Stride\uu IA、常数DSPSplitComplex*\uu B、,
vDSP步长IB,常数DSPSplitComplex*\uC,vDSP步长IC,
常数DSPSplitComplex*\uuuuu D、vDSP\u步长\uuuu ID、vDSP\u长度\uu N){
vDSP_长度n=0;
#ifdef_uuu手臂_u霓虹灯
vDSP_长度后码_开始=u N&~3;
对于(;nrealp+n);
float32x4\u t Br=vld1q\u f32(\u\u B->realp+n);
float32x4\u t Cr=vld1q\u f32(\u\u C->realp+n);
float32x4\u t Ai=vld1q\u f32(\u\u A->imagp+n);
float32x4\u t Bi=vld1q\u f32(\u\u B->imagp+n);
float32x4\u t Ci=vld1q\u f32(\u\u C->imagp+n);
浮动32x4_t Dr=vmlaq_f32(Cr,Ar,Br);
Dr=vmlsq_f32(Dr,Ai,Bi);
vst1q_f32(u D->realp+n,Dr);
浮动32x4_t Di=vmlaq_f32(Ci、Ar、Bi);
Di=vmlaq_f32(Di,Ai,Br);
vst1q_f32(u D->imagp+n,Di);
}
#恩迪夫
对于(;n<\n;n++){
__D->realp[n]=
__C->realp[n]+\uuu A->realp[n]*\uu B->realp[n]-\uu A->imagp[n]*\uu B->imagp[n];
__D->imagp[n]=
__C->imagp[n]+\uuu A->realp[n]*\uu B->imagp[n]+\uu A->imagp[n]*\uu B->realp[n];
}
}
但是,在我的测试中,性能相对较差(约为x3,不带/带霓虹灯)。 原因可能是什么?可以做些什么来解决这个问题


更新:澄清一下-这段代码比C(x3)中的naive循环运行得快得多,但是在我移植的其他函数中,性能增益更接近x4(正如预期的那样)。

使用
-O0
进行基准测试是完全无用的,尤其是对于内部函数。如果您想让编译器从您的内部语言中生成良好的机器代码,请使用
-O3
进行编译。这是否回答了您的问题@PeterCordes使用-O3编译器也优化了原始代码。令人惊讶的是,这一点变化不大。我的编译器标志通常是-O3-ffast math。我将编辑这个问题。“使用-O3编译器也会优化原始代码。”这是一个问题吗?你的意思是“使用-O3,我的手动调优版本与优化器版本的速度相同吗?”(如果是这样,那么你不就让编译器来完成这项工作吗?)。你真的想为循环同时运行
?“关于没有/有霓虹灯的x3”-这意味着什么?它比没有SIMD的代码快3倍?那还不错