X86 _mm512_load_epi32和_mm512_load_si512之间有什么区别?
《英特尔intrinsics指南》仅说明X86 _mm512_load_epi32和_mm512_load_si512之间有什么区别?,x86,sse,simd,intrinsics,avx512,X86,Sse,Simd,Intrinsics,Avx512,《英特尔intrinsics指南》仅说明\u mm512\u load\u epi32: 将内存中的512位(由16个压缩的32位整数组成)加载到dst中 而且\u mm512\u load\u si512: 将[s]512位整数数据从内存加载到dst 这两者有什么区别?文档不清楚。没有区别,只是愚蠢的冗余命名。为清晰起见,请使用\u mm512\u load\u si512。谢谢,英特尔。与往常一样,理解AVX512的底层asm更容易,然后您就可以看到笨拙的内在命名试图表达什么。或者至少你可以
\u mm512\u load\u epi32
:
将内存中的512位(由16个压缩的32位整数组成)加载到dst中
而且\u mm512\u load\u si512
:
将[s]512位整数数据从内存加载到dst
这两者有什么区别?文档不清楚。没有区别,只是愚蠢的冗余命名。为清晰起见,请使用
\u mm512\u load\u si512
。谢谢,英特尔。与往常一样,理解AVX512的底层asm更容易,然后您就可以看到笨拙的内在命名试图表达什么。或者至少你可以理解,我们最终是如何得到这堆不同的文档的,这些文档建议使用\u mm512\u load\u epi32
而不是\u mm512\u load\u si512
几乎所有AVX512指令都支持合并屏蔽和零屏蔽。
(例如,vmovdqa32
可以像vmovdqa32 zmm0{k1}{z},[rdi]
那样进行屏蔽加载,将k1
有零位的向量元素归零),这就是向量加载和按位操作等不同元素大小版本存在的原因。(例如)
但这些内部函数适用于无屏蔽版本。元素大小完全不相关。我猜存在\u mm512\u load\u epi32
是为了与\u mm512\u mask\u load\u epi32
(合并掩蔽)和\u mm512\u maskz\u load\u epi32
(零掩蔽)保持一致。有关asm说明,请参阅文档
e、 g.\u mm512\u maskz\u loadu\u epi64(0x55,x)
加载时免费将奇数元素归零。(如果将0x55
放入k
寄存器的成本可以从循环中提升出来,至少是免费的。如果我们没有阻止编译器将加载折叠到ALU指令的内存操作数中的机会。)
当所有元素都加载到目标中时,元素边界没有意义。这就是为什么AVX2和更早版本没有像\u mm\u xor\u si128这样的按位布尔的不同元素大小版本,也没有像\u mm\u load\u si128那样的加载/存储
某些编译器不支持未对齐无掩码加载的元素宽度名称。e、 g.当前gcc不支持\u mm512\u loadu\u epi64
,即使从第一个gcc版本开始就支持\u mm512\u loadu epi64
。(见附件)
没有CPU可以选择vmovdqa64
和vmovdqa32
来提高效率,因此,无论数据的自然元素宽度如何,都可以尝试提示编译器使用其中一个
只有FP和integer可能对负载有影响,Intel的intrinsic已经使用了不同的类型(\uuuum512
和\uuuum512i
)来实现这一点。没有区别,只是愚蠢的冗余命名。所有AVX512指令都可以与屏蔽一起使用(例如,vmovdqa32
可以进行屏蔽加载),但这些内部函数适用于无屏蔽版本。也许是感谢@PeterCordes的翻版,这很有意义(我也看到很多讨论出于一些类似的原因批评AVX512)。介意回答一下吗?这样我就可以被录取了?链接的Q有有趣的信息,但不是一个傻瓜。现在已经在这样做的过程中,在决定回答这个问题比在另一个Q上编辑我的答案更有意义之后,在评论中包含一些解释。顺便说一句,我希望你的意思是批评固有的命名。AVX512非常好,只是Intel不擅长命名其内部函数,而且自从他们开始命名shufflespermute
vs.shufshuf
并使AVX1vpermilps
vs.AVX2vpermps
超级混乱以来一直如此。是的,精确的命名约定。:)