【发布时间】:2017-12-21 19:25:59
【问题描述】:
我正在尝试实现一个需要计算某些数组的点积的应用程序。这需要非常快,所以我考虑用 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 的速度是错误的?您还有其他想法可以让它更快吗?
感谢您的回复!
【问题讨论】:
-
您是否检查过编译器是否已经在向量化标量代码?你也在使用
-O3吗? -
我不确定如何检查,但可能是这样。我没有使用 -O3 但现在我尝试使用它并给出相同的结果。
-
使用
objdump查看反汇编输出,或使用godbolt.org进行交互播放。
标签: arm simd neon dot-product