1

我有 128 个 32 位值(编号从 0 到 127),并按以下方式排序:

0, 32, 64, 96, 1, 33, 65, 97, ... 31, 63, 95, 127

通过这种排序,我将它们以 4 个为一组加载到 NEON 寄存器中以执行一些计算(这需要这种排序)。因此我有q0 = (0, 32, 64, 96)......等等。

我想知道是否有一些简单的方法将它们按自然顺序存储回内存(0 1 2 3 ...)

换句话说,是否有一些更简单的方法或技巧可以做到这一点:

vst1.u32 {d0[0]}, [r0]
vst1.u32 {d0[1]}, [r0,#128]
vst1.u32 {d1[0]}, [r0,#256]
vst1.u32 {d1[1]}, [r0,#384]
vst1.u32 {d2[0]}, [r0,#4]
vst1.u32 {d2[1]}, [r0,#132]
...

我不太明白@alignment后缀 withvstxvldx指令的使用。这不是一个有用的案例吗?

4

1 回答 1

2

对齐(@128,@256)用于提示处理器读/写不跨越缓存线。在这些情况下,可以减少执行的微操作(以及最终使用的周期)的数量。

相反,您的应用程序将受益于允许存储/加载列的指令格式。Arm 手册将这些通道称为小节(将 N 元素结构的单个通道存储到内存)。

该格式支持两个连续的寄存器:{d0,d1,d2,...} 和跳过一个寄存器 {d0,d2,d4,...}。

 mov #128, r1  // initialize value for increment
 vst4.32 { d0[0], d2[0], d4[0], d6[0] }, [r0], r1   // columns 0..1
 vst4.32 { d0[1], d2[1], d4[1], d6[1] }, [r0], r1   // store at offset 128
 vst4.32 { d1[0], d3[0], d5[0], d7[0] }, [r0], r1   // columns 2..3
 vst4.32 { d1[1], d3[1], d5[1], d7[1] }, [r0], r1   // columns 2..3
 ... etc ...

这可能是最好的方法,因为没有足够的寄存器来调整所有内容。我相信需要 32 个 Q 寄存器。

于 2013-04-28T06:30:46.980 回答