提问人:AoShen 提问时间:9/12/2023 最后编辑:Peter CordesAoShen 更新时间:9/12/2023 访问量:55
_mm512_mask_loadunpacklo_epi32是什么意思?
What's the meaning of _mm512_mask_loadunpacklo_epi32?
问:
我是 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
答: 暂无答案
评论
_mm512_mask_loadunpacklo_epi32
不是内在的,你还没有显示定义。它甚至不是英特尔的 SVML 库函数之一,也是其内部指南 (intel.com/content/www/us/en/docs/intrinsics-guide/index.html) 的一部分。你引用的文字把它说成一个函数,大概他们在那篇文章的某个地方定义了它。_mm512_sllv_epi32
_mm512_maskz_unpacklo_epi32
vpunpckldq zmm {k1}{z}, zmm, [mem]