ARM Cortex A53上的NEON SIMD dotproduct速度不快

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM Cortex A53上的NEON SIMD dotproduct速度不快相关的知识,希望对你有一定的参考价值。

我正在尝试实现一个需要计算某些数组的dotproduct的应用程序。这需要非常快,所以我考虑用Neon测试SIMD。我能够重写我的功能以使用SIMD,但是测量的时间与以前几乎相同,有时甚至更多。没有SIMD就像31秒和SIMD 32秒。

这是我的SIMD代码:

        float output = 0.0;

    for (int i=0; i<NUMBER_OF_INPUTS; i+=4)
    {
        in1_126 = vld1q_f32(&source[i]);
        in2_126 = vld1q_f32(&weights[i]);
        out_126 = vmulq_f32(in1_126, in2_126);
        output +=  vaddvq_f32(out_126);
    }

    return output;  

在这里没有:

    float output = 0.0;
    float tmp;



    for(unsigned int i = 0; i < NUMBER_OF_INPUTS; i++)
    {
        tmp = source[i] * weights[i];
        output += tmp;  
    }

    return output;  

我已经设置了那些编译器标志:

-mcpu=cortex-a53 -march=armv8-a+simd+crypto

但它没有改变任何东西。

为什么时间几乎没有差别?或者以错误的方式使用NEON让我的dotproduct更快?你有什么其他的想法让它更快吗?

谢谢你的回复!

答案

你不应该在循环中从向量寄存器移动到标量。

它会导致管道冲洗,每次发生时大约花费14个周期。 (在ARMv7-A上)

这些循环次数取决于具体的架构。

你可以尝试什么:

out126 = vmovq_n_f32(0.0f);
for (int i=0; i<NUMBER_OF_INPUTS; i+=4)
{
  in1_126 = vld1q_f32(&source[i]);
  in2_126 = vld1q_f32(&weights[i]);
  out_126 = vmlaq_f32(out_126, in1_126, in2_126);
}

output =  vaddvq_f32(out_126);

以上是关于ARM Cortex A53上的NEON SIMD dotproduct速度不快的主要内容,如果未能解决你的问题,请参考以下文章

Linux下VFP NEON浮点编译

寻找没有 NEON 的 ARM Cortex A9 板

如何在 ARM NEON SIMD 内在函数上编写“a[i]=b[c[i]]”

迅为八核cortex a53开发板android/linux/Ubuntu系统

时钟周期计数变化 Cortex A53 AArch64

ARM NEON指令集总结