我也是纯新手,看了这篇博客http://blog.csdn.net/may0324/article/details/72847800,感觉对上手很有帮助。本文也是由这篇博客给的例子出发,探讨一些问题。
#include
#include
using namespace std;
float sum_array(float* arr,int len);
int main()
{
long l=100000;
float array[l];
for(long i=0;i
首先是普通的c++代码(记为no_neon),
#include
#include
#include
using namespace std;
float sum_array(float* arr,int len);
int main()
{
long l=100000;
float array[l];
for(long i=0;i0;dim4--,arr+=4)
{
float32x4_t data_vec = vld1q_f32(arr);
sum_vec = vaddq_f32(sum_vec,data_vec);
}
float sum = vgetq_lane_f32(sum_vec,0)+vgetq_lane_f32(sum_vec,1)+vgetq_lane_f32(sum_vec,2)+vgetq_lane_f32(sum_vec,3);
for(;left4>0;left4--,arr++)
{
sum+=(*arr);
}
return sum;
}
这是上面博客中作者给出的neon优化后的代码(记为neon)。功能很简单,就是一个10万个浮点数据的数组求和。
#include
#include
#include
using namespace std;
float sum_array(float* arr,int len);
int main()
{
long l=100000;
float array[l];
for(long i=0;i if(l%4!=0)
{
int a=4-l%4;
l+=a;
for(int i=1;i<=a;i++)
{
array[l-i]=0;
}
}
clock_t starttime=clock();
for(int round=1;round<=1000;round++)
{
float Sum=sum_array(array,l);
//cout<0;dim4--,arr+=4)
{
float32x4_t data_vec = vld1q_f32(arr);
sum_vec = vaddq_f32(sum_vec,data_vec);
}
float sum = vgetq_lane_f32(sum_vec,0)+vgetq_lane_f32(sum_vec,1)+vgetq_lane_f32(sum_vec,2)+vgetq_lane_f32(sum_vec,3);
return sum;
}
记为neon1,红字部分就是扩展数组长度,并将扩展的位赋0 。测试结果:
clock_t starttime=clock();
for(int round=1;round<=1000;round++)
{
float32x4x4_t data_vec;
float32x4_t sum_vec = vdupq_n_f32(0.0);
for(long i=0;i+16<=l;i+=16)
{
data_vec=vld4q_f32(arr+i);
for(int j=0;j<4;j++)
{
sum_vec = vaddq_f32(sum_vec,data_vec.val[j]);
}
}
float sum = vgetq_lane_f32(sum_vec,0)+vgetq_lane_f32(sum_vec,1)+vgetq_lane_f32(sum_vec,2)+vgetq_lane_f32(sum_vec,3);
//cout<
其中data_vec.val[j]表示结构化输入占用的一个寄存器。