我正在处理一个数据结构,其中我有一个包含16个uint64的数组。它们在内存中的布局如下(每个表示单个int64):
A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3
期望的结果是将数组转置为以下形式:
A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3
将数组旋转90度也是未来循环的可接受解决方案:
D0 C0 B0 A0 D1 C1 B1 A1 D2 C2 B2 A2 D3 C3 B3 A3
我需要这个操作,以便在稍后的时间中快速处理箭头(使用另一个SIMD trip逐个遍历,每次4个)。
到目前为止,我已经尝试通过加载A的4 x 64位向量、按位掩码和重新排列元素并与B等进行或运算等来“混合”数据,然后为C等重复这个过程…不幸的是,这是数组中4个元素的每个段的5 x 4 SIMD指令(一次加载、一次掩码、一次洗牌、一次与下一个元素的或运算和最后一次存储)。看起来我应该能做得更好。
我拥有AVX2,并且正在使用clang进行编译。