英特尔的内部指南列出了内部_mm256_loadu_epi32
:
_mm256_loadu_epi32
但是clang和gcc没有提供此内在函数。相反,它们仅提供(在文件_m256i _mm256_loadu_epi32 (void const* mem_addr);
/*
Instruction: vmovdqu32 ymm, m256
CPUID Flags: AVX512VL + AVX512F
Description
Load 256-bits (composed of 8 packed 32-bit integers) from memory into dst.
mem_addr does not need to be aligned on any particular boundary.
Operation
a[255:0] := MEM[mem_addr+255:mem_addr]
dst[MAX:256] := 0
*/
中)被屏蔽的版本
avx512vlintrin.h
归结为相同的指令_mm256_mask_loadu_epi32 (__m256i, __mmask8, void const *);
_mm256_maskz_loadu_epi32 (__mmask8, void const *);
。我的问题:如何模拟vmovdqu32
:
_mm256_loadu_epi32
没有编写汇编程序,即仅使用可用的内部函数?
只需像普通人一样使用 inline _m256i _mm256_loadu_epi32(void const* mem_addr)
{
/* code using vmovdqu32 and compiles with gcc */
}
。 AVX512内在函数唯一给您的是一个更好的原型(_mm256_loadu_si256
而不是const void*
)。
@@ chtz建议您仍可能要自己编写包装函数才能获得const __m256i*
原型。但不要称它为void*
;一些将来的GCC版本可能会添加该版本以使其与Intel的文档兼容,并破坏您的代码。
您甚至不希望在不屏蔽时编译器发出_mm256_loadu_epi32
; vmovdqu32 ymm
较短,并且[vmovdqu ymm。如果编译器要加载到ymm16..31,则始终可以使用with no penalty for mixing with EVEX-encoded instructions或vmovdqu32
,否则,您希望编译器使用较短的VEX编码的AVX1 64
。我很确定GCC对待vmovdqu
的方式与_mm256_maskz_epi32(0xffu,ptr)
完全相同,并且不管使用哪种方式,都制作相同的asm。它可以优化_mm256_loadu_si256((const __m256i*)ptr)
掩码并仅使用未掩码的负载,但是在您的源代码中不需要这种额外的复杂操作。
[但是不幸的是,即使启用了0xffu
,当启用AVX512VL(例如vmovdqu32 ymm0, [mem]
)时,当前的GCC也会简化为-march=skylake-avx512
。这是错过优化,
_mm256_loadu_si256
只要没有屏蔽,您使用哪个256位负载固有变量(对齐与未对齐除外)都没有关系。
相关: