如何解决交错两个向量
我正在尝试使用 SIMD 的第一步,我想知道解决以下问题的正确方法是什么。考虑两个向量:
+---+---+---+---+ +---+---+---+---+
| 0 | 1 | 2 | 3 | | 4 | 5 | 6 | 7 |
+---+---+---+---+ +---+---+---+---+
如何“交错”这些向量的元素,使它们变成:
+---+---+---+---+ +---+---+---+---+
| 0 | 4 | 1 | 5 | | 2 | 6 | 3 | 7 |
+---+---+---+---+ +---+---+---+---+
我很惊讶我找不到执行此操作的说明,因为有许多种洗牌、广播、置换……可能可以用一些 unpacklo
和 unpackhi
和什么不是,但我想知道是否有一种规范的方式来做这件事,因为这似乎是一个很常见的问题(SoA vs. AoS)。为简单起见,让我们假设 AVX(2) 和四个浮点数的向量。
编辑:
浮动与双打
下面的评论(正确地)建议我应该将 unpcklps
和 unpckhps
用于浮动。我应该使用哪条指令来解包四个双精度向量?我问是因为_mm256_unpacklo_pd
/_mm256_unpackhi_pd
:
从 a 和 b 中每个 128 位通道的高半部分解包和交错双精度(64 位)浮点元素,并将结果存储在 dst 中。
DEFINE INTERLEAVE_HIGH_QWORDS(src1[127:0],src2[127:0]) {
dst[63:0] := src1[127:64]
dst[127:64] := src2[127:64]
RETURN dst[127:0]
}
dst[127:0] := INTERLEAVE_HIGH_QWORDS(a[127:0],b[127:0])
dst[255:128] := INTERLEAVE_HIGH_QWORDS(a[255:128],b[255:128])
dst[MAX:256] := 0
所以它显然是:
+---+---+---+---+ +---+---+---+---+
| 0 | 4 | 2 | 6 | | 1 | 5 | 3 | 7 |
+---+---+---+---+ +---+---+---+---+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。