我正在研究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中的其余元素。
是否有更清晰的描述或可以解释更多的人?
谢谢。
答案 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 操作的效果,即它使用位掩码α从ω中选择条目并将这些条目连续存储到内存中。
>