【发布时间】:2020-04-26 04:36:12
【问题描述】:
英特尔的内在指南列出了内在的_mm256_loadu_epi32:
_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
*/
但是 clang 和 gcc 不提供这个内在的。相反,他们只提供(在文件 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 */
}
无需编写程序集,即仅使用可用的内在函数?
【问题讨论】:
-
由于您不需要遮罩(因此元素大小无关紧要),您可以使用
_mm256_loadu_si256。 -
@PaulR 这比
_mm256_maskz_epi32(0xffu,ptr)好吗?您会将此评论提升为答案吗? -
是的,这样更好。如果编译器想要加载到 ymm16..31 中,它总是可以使用 AVX512 编码,否则你希望它使用更短的
vmovdqu。相关:What is the difference between _mm512_load_epi32 and _mm512_load_si512? -
请注意,使用
_mm256_loadu_si256,您需要将输入指针转换为const __m256i*(所以这不是一个坏主意,将其封装到内联函数中)
标签: c++ c intrinsics avx512