学习 ARM NEON 内在函数时,我正在计时一个我编写的函数以将数组中的元素加倍。使用内在函数的版本比函数的普通 C 版本需要更多时间。
没有霓虹灯:
void double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int loop;
for( loop= 0; loop<size; loop++)
ptr[loop]<<=1;
return;
}
使用霓虹灯:
void double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int i;
uint32x4_t Q0,vector128Output;
for( i=0;i<(SIZE/4);i++)
{
Q0=vld1q_u32(ptr);
Q0=vaddq_u32(Q0,Q0);
vst1q_u32(ptr,Q0);
ptr+=4;
}
return;
}
想知道数组和向量之间的加载/存储操作是否会消耗更多时间,这抵消了并行加法的好处。
更新:更多信息以回应 Igor 的回复。
1.代码贴在这里:
plain.c
plain.s
neon.c
neon.s
从两个汇编列表中的第(标签)L7部分,我看到霓虹版本有更多的汇编指令。(因此更多时间采取?)
2.我在 arm-gcc 上使用 -mfpu=neon 编译,没有其他标志或优化。对于普通版本,根本没有编译器标志。
3.那是一个错字,SIZE 是指尺寸;两者都是一样的。
4,5.尝试了一个包含 4000 个元素的数组。我在函数调用前后使用 gettimeofday() 进行计时。NEON=230us,ordinary=155us。
6.是的,我在每种情况下都打印了元素。
7.这样做了,没有任何改善。