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速度不快的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ARM NEON SIMD 内在函数上编写“a[i]=b[c[i]]”