X86 _mm512_load_epi32和_mm512_load_si512之间有什么区别?

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更容易,然后您就可以看到笨拙的内在命名试图表达什么。或者至少你可以

《英特尔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
而不是
\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不擅长命名其内部函数,而且自从他们开始命名shuffles
permute
vs.shuf
shuf
并使AVX1
vpermilps
vs.AVX2
vpermps
超级混乱以来一直如此。是的,精确的命名约定。:)