【问题标题】:Gather four 32-bit words from two 128-bit blocks从两个 128 位块中收集四个 32 位字
【发布时间】:2017-12-03 10:07:56
【问题描述】:

我正在使用 C 内部函数处理从 SSE 到 NEON 的端口。我有两个由 32 位字组成的 128 位块:

[A1  A2  A3  A4] [B1  B2  B3  B4]

我需要像这样将它们收集成两个uint32x4_t

[A1  B1  A2  B2] [A3  B3  A4  B4]

128 位块及其相关的步幅给我带来了麻烦。我查看了 ARM 的 NEON Part 1: Load and Stores,但没有看到跨越两个 16 字节块的内容。

如何从两个 128 位块中收集数据?

【问题讨论】:

  • 使用 SSE,您想要的指令是 punpckldqpunpckhdq 来交错两个向量,而不是标量插入! SSE 缺乏的是像 ARM 的 vunzp 这样的去交错。
  • @PeterCordes - 是的...我需要与 ARM 的 vunzp 等效的 SSE。我实际上问错了问题,但是一旦 Jake 提供了答案,就太迟了。
  • 实际上shufps 可以做相反的事情:A1 和 A2 从你的第一个“输出”向量(进入目标的底部 64 位),以及从第二个(进入顶部)的 A3 和 A4 64 位)。 (是的,对整数数据使用 FP shuffle 是值得的。Nehalem 会有一点额外的延迟,但仍然有很好的吞吐量。)SSE 指令只有一个向量输出操作数。
  • 不,每个结果向量有一个 shufps([A1 B1 A2 B2], [A3 B3 A4 B4], _MM_SHUFFLE(2,0,2,0))(3,1,3,1)。如果您查看 shufps 手册并考虑如何使用它,这应该很明显......如果您需要避免破坏其中一个输入,则需要先复制一个。
  • 无论如何,clang 有一个很好的 shuffle 优化器。你经常可以给它低效的洗牌,它会找出一些好的东西。 (但它有时会使精心挑选的洗牌感到悲观,请参阅stackoverflow.com/questions/6996764/…

标签: c arm intrinsics neon


【解决方案1】:

VZIP.32 正是您要找的东西

from MSB to LSB:
q0: A4 | A3 | A2 | A1
q1: B4 | B3 | B2 | B1

vzip.32 q0, q1

q0: B2 | A2 | B1 | A1
q1: B4 | A4 | B3 | A3

aarch64 上,情况完全不同。

from MSB to LSB:
v0: A4 | A3 | A2 | A1
v1: B4 | B3 | B2 | B1

zip2 v2.4s, v0.4s, v1.4s
zip1 v3.4s, v0.4s, v1.4s

v2: B2 | A2 | B1 | A1
v3: B4 | A4 | B3 | A3

而且你不应该把时间浪费在内在函数上。

我的程序集版本 4x4 矩阵乘法(浮点数、复数)的运行速度几乎是由 Clang 编译的“勺子式”内在函数版本的三倍。

*GCC (7.1.1) 编译版本比 Clang 编译版本稍快,但相差不大。


以下是以 32 位整数为例的内部函数版本。它适用于 A-32 NEON、Aarch32 和 Aarch64。

uint32x4_t vecA, vecB;
...

uint32x4x2_t vecR = vzipq_u32(vecA, vecB);
uint32x4_t vecX = vecR.val[0];
uint32x4_t vecY = vecR.val[1];

请注意vzip2 组合了前半部分(下半部分),而vzip1 组合了后半部分(上半部分)。它们由uint32x4x2_tval[0]val[1] 访问。一旦访问了val[],编译器就可以选择zip1zip2指令。

【讨论】:

  • @jww 事实上,在我的测试运行中,内在函数版本并没有比普通的 C 版本快多少,这几乎与使用 NEON 开始时的观点相悖。我希望你知道你在做什么。 500k 次迭代:C:196ms,Intrinsics:152ms,asm:60ms。它不仅仅是0.1cpb。祝你好运。
  • @jww 我刚刚在 Galaxy S7(aarch64,无序)上运行了一个基准测试,它是 50 毫秒对 3 毫秒。可惜我没有A53测试板。无论如何,再次祝你好运。
  • @jww 糟糕,抱歉。这是 52 毫秒与 29 毫秒
  • @jww 完成。您能否检查一下 zip1 和 zip2 是否按照 ARM 文档的方式工作? infocenter.arm.com/help/index.jsp?topic=/…
  • 顺便说一下,这就是为什么我试图坚持内在函数:Microsoft Showcases Qualcomm ARM-Based Windows 10 PCs Coming Next Year。我们支持 Windows 手机、Windows 平板电脑和即将推出的平台,如 ARM 桌面。如果我们切换到 GAS 组件,那么我们会失去 Windows 和 ARM 的更高性能。我们放弃它是因为微软不提供内联 ARM 汇编器;而且他们没有记录他们独立的 ARM 汇编程序。
猜你喜欢
  • 2020-10-17
  • 2019-04-28
  • 2011-01-14
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多