时间:2018-07-09 09:44:45

标签: assembly x86 simd avx512

我正在研究Intel intrinsics guide中的展开和压缩操作。我对这两个概念感到困惑:

对于__m128d _mm_mask_expand_pd (__m128d src, __mmask8 k, __m128d a) == vexpandpd

  

从a中加载连续的活动双精度(64位)浮点元素(其各自的位在掩码k中设置),并使用写掩码k将结果存储在dst中(当相应的元素从src复制时屏蔽位未设置。

对于__m128d _mm_mask_compress_pd (__m128d src, __mmask8 k, __m128d a) == vcompresspd

  

将活动双精度(64位)浮点元素连续存储在dst中(它们各自的位在写掩码k中设置的那些元素)到dst,并通过src中的其余元素。

是否有更清晰的描述或可以解释更多的人?

谢谢。

1 个答案:

答案 0 :(得分:7)

这些指令实现APL运算符\(扩展)和/(压缩)。 Expand 取一个设置为 n m n 位的位掩码α和一个数组ω n 个数字,并返回一个 m 个数字的向量,其中ω中的数字插入到由α表示的位置中,其余设置为零。例如,

0 1 1 0 1 0 \ 2 3 4

返回

0 2 3 0 4 0

_mm_mask_expand_pd指令针对固定的 m = 8实现此运算符。

compress 操作取消​​了 expand 操作的效果,即它使用位掩码α从ω中选择条目并将这些条目连续存储到内存中。

>