如何用gcc或clang模拟_mm256_loadu_epi32?

问题描述 投票:2回答:1

英特尔的内部指南列出了内部_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

没有编写汇编程序,即仅使用可用的内部函数?

c++ c intrinsics avx512
1个回答
0
投票

只需像普通人一样使用 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_epi32vmovdqu32 ymm较短,并且[vmovdqu ymm。如果编译器要加载到ymm16..31,则始终可以使用with no penalty for mixing with EVEX-encoded instructionsvmovdqu32,否则,您希望编译器使用较短的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位负载固有变量(对齐与未对齐除外)都没有关系。

相关:

© www.soinside.com 2019 - 2024. All rights reserved.