代码之家  ›  专栏  ›  技术社区  ›  Qix - MONICA WAS MISTREATED

_mm512_load_epi32和_mm512_load_si512之间有什么区别?

  •  3
  • Qix - MONICA WAS MISTREATED  · 技术社区  · 6 年前

    《英特尔intrinsics指南》简单地指出 _mm512_load_epi32 :

    将内存中的512位(由16个压缩的32位整数组成)加载到dst中

    _mm512_load_si512

    将[s]512位整数数据从内存加载到dst

    1 回复  |  直到 6 年前
        1
  •  11
  •   Peter Cordes    6 年前

    _mm512_load_si512 为了清楚起见。 谢谢,英特尔。与往常一样,理解AVX512的底层asm更容易,然后您就可以看到笨拙的内在命名试图表达什么。或者至少你可以理解我们是如何处理这些混乱的文件的 _mm512_load_epi32 vs。 _mm512_加载_si512 .

    . vmovdqa32 你能做一个像这样的伪装任务吗 vmovdqa32 zmm0{k1}{z}, [rdi] 到零向量元素,其中 k1 这就是为什么存在不同元素大小的版本,比如向量加载和按位操作。(例如。 vpxord vs. vpxorq ).

    但这些本质是针对无掩蔽版本的。元素大小完全不相关。 我猜 _mm512_加载_epi32 _mm512_mask_load_epi32 (合并屏蔽)和 _mm512_maskz_load_epi32 vmovdqa32 asm指令。

    例如 _mm512_maskz_loadu_epi64(0x55, x) 加载时免费将奇数元素归零。(至少它是免费的,如果 0x55 变成 k 寄存器可以从一个环中吊起。如果我们没有阻止编译器将加载折叠到ALU指令的内存操作数中的机会。)

    当所有元素都加载到目标中时,元素边界没有意义。这就是为什么AVX2和更早版本没有不同的按位布尔值元素大小版本,比如 _mm_xor_si128 并且装载/存储类似于 _mm_load_si128 .


    不结盟 . e、 g.当前gcc不支持 _mm512_loadu_epi64 即使它得到了支持 _mm512_load_epi64 自从第一个gcc版本支持AVX512内部函数以来。(见 error: '_mm512_loadu_epi64' was not declared in this scope )

    vmovdqa64 vs。 事关效率 ,因此,无论数据的自然元素宽度如何,试图提示编译器使用其中一种方法是没有意义的。

    只有FP与integer可能对加载有影响,Intel的Intrinsic已经使用了不同的类型( __m512 vs。 __m512i )为此。