【发布时间】: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,您想要的指令是
punpckldq和punpckhdq来交错两个向量,而不是标量插入! 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