9

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

为了__m128d _mm_mask_expand_pd (__m128d src, __mmask8 k, __m128d a) == vexpandpd

从 a 加载连续的活动双精度(64 位)浮点元素(它们各自的位在掩码 k 中设置),并使用 writemask k 将结果存储在 dst 中(当相应的掩码位为没有设置)。

为了__m128d _mm_mask_compress_pd (__m128d src, __mmask8 k, __m128d a) == vcompresspd

将 a 中的活动双精度(64 位)浮点元素(在 writemask k 中设置了相应位的元素)连续存储到 dst,并从 src 传递其余元素。

有没有更清晰的描述或谁能解释更多?

4

1 回答 1

9

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

0 1 1 0 1 0 \ 2 3 4

返回

0 2 3 0 4 0

_mm_mask_expand_pd指令为固定m = 8 实现此运算符。

压缩操作取消了扩展操作的影响,即它使用位掩码 α 从 ω 中选择条目并将这些条目连续存储到内存中。

于 2018-07-09T10:11:03.453 回答