gpt4 book ai didi

arm - 使用内在函数进行 Neon 优化

转载 作者:行者123 更新时间:2023-12-02 18:13:51 24 4
gpt4 key购买 nike

在了解 ARM NEON 内在函数时,我正在对一个函数进行计时,该函数将数组中的元素加倍。使用该内在函数的版本比该函数的普通 C 版本需要更多时间。

没有 NEON :

    void  double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int loop;
for( loop= 0; loop<size; loop++)
ptr[loop]<<=1;
return;
}

使用 NEON :

 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;
}

想知道数组和向量之间的加载/存储操作是否消耗了更多时间,从而抵消了并行加法的好处。

更新:针对伊戈尔回复的更多信息。
1.代码贴在这里:
plain.c
plain.s
neon.c
neon.s
从两个汇编列表中的 L7 部分,我看到 neon 版本有更多数量的汇编指令。(因此花费了更多时间?)
2.我在arm-gcc上使用-mfpu=neon进行编译,没有其他标志或优化。对于普通版本,根本没有编译器标志。
3.这是一个拼写错误,SIZE 的意思是尺寸;两者是相同的。
4,5.尝试了 4000 个元素的数组。我在函数调用之前和之后使用 gettimeofday() 进行计时。NEON=230us,ordinary=155us。
6.是的,我打印了每种情况下的元素。
7.这样做了,没有任何改善。

最佳答案

像这样的东西可能运行得更快一点。

void  double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int i;
uint32x4_t Q0,Q1,Q2,Q3;

for( i=0;i<(SIZE/16);i++)
{
Q0=vld1q_u32(ptr);
Q1=vld1q_u32(ptr+4);
Q0=vaddq_u32(Q0,Q0);
Q2=vld1q_u32(ptr+8);
Q1=vaddq_u32(Q1,Q1);
Q3=vld1q_u32(ptr+12);
Q2=vaddq_u32(Q2,Q2);
vst1q_u32(ptr,Q0);
Q3=vaddq_u32(Q3,Q3);
vst1q_u32(ptr+4,Q1);
vst1q_u32(ptr+8,Q2);
vst1q_u32(ptr+12,Q3);
ptr+=16;

}
return;
}

原始代码存在一些问题(其中一些优化器可能会修复,但其他可能不会,您需要在生成的代码中进行验证):

  • 添加的结果仅在 NEON 管道的 N3 阶段可用,因此后续存储将停止。
  • 假设编译器没有展开循环,则可能会产生一些与循环/分支相关的开销。
  • 它没有利用与另一个 NEON 指令双重发出加载/存储的功能。
  • 如果源数据不在缓存中,则加载将停止。您可以使用__builtin_prefetch内在函数预加载数据以加快速度。
  • 此外,正如其他人指出的那样,该操作相当简单,您会发现更复杂的操作会带来更多 yield 。

如果您要使用内联汇编编写此代码,您还可以:

  • 使用对齐的加载/存储(我认为内在函数无法生成)并确保您的指针始终是 128 位对齐的,例如vld1.32 {q0},[r1:128]
  • 您还可以使用后增量版本(我也不确定内在函数是否会生成),例如vld1.32 {q0},[r1:128]!

4000 个元素的 95us 听起来相当慢,在 1GHz 处理器上,每个 128 位 block 大约有 95 个周期。假设您使用缓存工作,您应该能够做得更好。如果您受到外部存储器速度的限制,这个数字大约是您所期望的。

关于arm - 使用内在函数进行 Neon 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5717011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com