Assembly 使用avx2从两个向量中检索和交错元素

Assembly 使用avx2从两个向量中检索和交错元素,assembly,intel,intrinsics,avx,avx2,Assembly,Intel,Intrinsics,Avx,Avx2,给定avx2中的两个单精度浮点向量a和b: [0;1;2;3;4;5;6;7] [8;9;10;11;12;13;14;15] 我想在两个向量中取两个元素中的一个,并在输出中交错它们。理想情况下,控件选择器将帮助我指定在两个向量中选择哪个元素(比如偶数或奇数)。因此,对于a和b,可能的输出为: v0[0;8;2;10;4;12;6;14] v1:[1;8;3;10;5;12;7;14] v2[0;9;2;11;4;13;6;15] v3:[1;9;3;11;5;13;7;15] Blend_ps

给定avx2中的两个单精度浮点向量a和b: [0;1;2;3;4;5;6;7] [8;9;10;11;12;13;14;15]

我想在两个向量中取两个元素中的一个,并在输出中交错它们。理想情况下,控件选择器将帮助我指定在两个向量中选择哪个元素(比如偶数或奇数)。因此,对于a和b,可能的输出为:


v0[0;8;2;10;4;12;6;14]
v1:[1;8;3;10;5;12;7;14]
v2[0;9;2;11;4;13;6;15]
v3:[1;9;3;11;5;13;7;15]

Blend_ps可以为v2做这项工作如果我没弄错的话,我需要其他的。理想情况下,它需要一条指令(我相信我可以找到其他解决方案,例如,排列一个输入,然后进行混合)。我这样问是因为这看起来像是一种非常常规的操作,而且像这样的东西可以在ISA中硬编码似乎也不太牵强,但直到现在我还没有找到任何完全相关的东西。例如,它不进行跨车道访问

解包hi和解包lo实际上非常接近,但它们以更大的粒度交错-您得到的是这种形状的东西:
[a;a;B;B;a;a;B;B]

其中A(B)表示来自向量A(B)的元素

有这样的指示吗?
提前感谢。

clang也只是为
v2
找到了一个指令实现:您确定需要其他变体,还是有类似
[a0,a2,b0,b2;a4,a6,b4,b6]
(这将是
shufps
)?没有任何数据跨越车道边界,因此如果高车道和低车道的模式相同,则有希望获得
vshufps
。或者您可能需要一个临时的洗牌结果,然后使用blendps。这只是快速浏览的结果。顺便说一句,没有
\u mm256\u unplo\u ps
在两个向量之间交替浮动。它是
abab
,但没有间隙
AB
将是对浮点数据使用unpack…\u pd时得到的结果。首先,感谢您的回答。如果我读对了这个文档:我认为shuffle_ps不适合我的需要-它有一个AABBAABB模式(据我所知,unpack_{lo,hi}实现的实际上是shuffle_ps的一个特殊情况。使用我的符号,unpack__ps将返回[0;1;8;9;4;5;12;13]和unpack_hi[2;3;10;11;6;7;14;15].Shuffle在允许我选择的感官中更为通用:两个(任意)元素来自a的第一条车道,然后是b的第一条车道的两个元素,然后是a的第二条车道的两个元素,等等。我需要得到a的一个元素,然后是b的一个元素,等等。正如chtz所说,你可以用一个混合来构建
v2
。然后可能是
shufps
在混合结果和一个原始向量之间?或者是的,AVX2整数移位(如
vpsrlq ymm,32
),则FP blendps是一个好主意。混洗吞吐量很容易成为瓶颈;在IceLake之前,Intel CPU只有1/时钟混洗吞吐量。