_mm512_mask_loadunpacklo_epi32是什么意思?

What's the meaning of _mm512_mask_loadunpacklo_epi32?

提问人:AoShen 提问时间:9/12/2023 最后编辑:Peter CordesAoShen 更新时间:9/12/2023 访问量:55

问:

我是 AVX-512 的初学者,当我阅读开源程序的源代码时,我发现了以下代码:

__m512i vecData1;
__mmask16 vecMask;
int32_t *addrF = (int32_t *)_mm_malloc(sizeof(int32_t), 64);
...
vecData1 = _mm512_mask_loadunpacklo_epi32(vecZero, vecMask, addrF);
vecData1 = _mm512_mask_loadunpacklo_epi32(vecData1, vecMask, addrF+16);

我试图找到文档,我得到了以下文本

从元素对齐地址 mt 开始的双字流的低 64 字节对齐部分被加载并扩展为生成的双字向量的启用了写掩码的元素,其初始值是从v1_old向量复制的。写掩码中的设置位数决定了双字流的长度,因为每个双字都精确地映射到结果向量中的一个双字元素,跳过结果向量的写掩码元素。

此函数仅传输流中出现在 mt 之后的第一个 64 字节对齐地址(即当前实现的内存流的低缓存行中)或之后出现的双字(如果有)。结果向量中未映射到这些流双字的元素保持不变(取自v1_old)。_mm512_loadunpackhi_epi32 函数用于在 mt 之前的第一个 64 字节对齐地址或之后加载流的部分。

此函数与 _mm512_loadunpackhi_epi32 结合使用,可用于重新扩展打包到队列中的数据。此外,与_mm512_loadunpackhi_epi32结合使用时,它允许未对齐的矢量载荷(即,仅按元素对齐的矢量载荷,而不是按矢量对齐的矢量载荷)。执行未对齐矢量载荷的典型内在序列为:v1 = _mm512_loadunpacklo_epi32(v1, mt); v1 = _mm512_loadunpackhi_epi32(v1, mt+64);

但是我还是不明白这个指令的意思,尤其是,谁能帮我?多谢!doubleword stream

x86 英特尔 内部处理器 AVX512

评论

0赞 Peter Cordes 9/12/2023
_mm512_mask_loadunpacklo_epi32不是内在的,你还没有显示定义。它甚至不是英特尔的 SVML 库函数之一,也是其内部指南 (intel.com/content/www/us/en/docs/intrinsics-guide/index.html) 的一部分。你引用的文字把它说成一个函数,大概他们在那篇文章的某个地方定义了它。
0赞 Peter Cordes 9/12/2023
您问题中的链接 (portal.nacad.ufrj.br/online/intel/compiler_c/common/core/...) 是英特尔编译器文档的一些随机副本的文档。它不包含您引用的文本。_mm512_sllv_epi32
0赞 Peter Cordes 9/12/2023
“双字流”只是内存中 32 位元素的数组。“流”这个词意味着我们可能不知道它有多长,也许这就是我们使用掩蔽负载的原因。例如,“字节流”是您可能在网络协议或序列化/反序列化到文件中听到的概念。dword 流只是具有更广泛的元素。
0赞 AoShen 9/13/2023
@PeterCordes 非常感谢。页面链接正确,但位置尴尬。我错过了内部函数属于英特尔®初始许多核心指令。我会尝试在正确的文档中找到。
0赞 Peter Cordes 9/13/2023
哦,第一代 Xeon Phi,KNF(骑士渡轮),早已停产。它有一个类似于 AVX-512 的 512 位矢量指令集,但有一些区别。使用 AVX-512 内部函数,您只需使用屏蔽的 512 位加载和单独的加载,并希望编译器将其折叠到内存源操作数中_mm512_maskz_unpacklo_epi32vpunpckldq zmm {k1}{z}, zmm, [mem]

答: 暂无答案