在简单的添加任务中使用ARM NEON速度较慢

问题描述 投票:0回答:1

我试图编写一个简单的NEON代码,但是发现它比常规的C ++实现要慢。代码如下

float A[] = {1,2,3,4}; 
float B[] = {2,3,4,5}; 
float32x4_t v1;
float32x4_t v2;

int counter = 1000000;

while(counter--){
     v1 = vld1q_f32(A);
     v2 = vld1q_f32(B);
     v = vaddq_f32(v1,v2);

     vst1q_f32(A,v);
     // A[0] = A[0]+B[0]; // regular implementation
     // A[1] = A[1]+B[1]; // regular implementation 
     // A[2] = A[2]+B[2]; // regular implementation
     // A[3] = A[3]+B[3]; // regular implementation

 }

我搜索了原因,所以我想这是因为顺序排列的管道,这个简单的任务导致CPU停顿了?但是,谁能帮忙详细解释一下?是否有任何方法可以改善此NEON实现的性能?还是在面对这种简单任务时使用常规实现比使用NEON更好?谢谢。

arm neon
1个回答
0
投票

如果您使用内在函数进行加载/存储,则编译器似乎会将它们保留下来。

没有内在函数,它可以优化加载/存储,仅将寄存器用于中间值。看一下生成的程序集:https://www.godbolt.org/z/FvqKP3

此外,我猜想在通过另一次传输写入同一内​​存的同时将某些内容加载到NEON中可能是一个非常罕见的用例,CPU设计人员不必费心实现直接旁路。您可能需要等到存储完全完成后才能开始加载。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.