gpt4 book ai didi

c++ - 如何使用 gcc 或 clang 模拟 _mm256_loadu_epi32?

转载 作者:行者123 更新时间:2023-12-02 06:48:27 34 4
gpt4 key购买 nike

英特尔的内在指南列出了内在 _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即可。 AVX512 内在函数为您提供的唯一东西是一个更好的原型(prototype)(const void* 而不是 const __m256i*),因此您不必编写难看的强制转换。

@chtz 建议您可能仍然想自己编写一个包装函数来获取 void* 原型(prototype)。但不要将其称为_mm256_loadu_epi32;某些 future 的 GCC 版本可能会添加它以与 Intel 的文档兼容并破坏您的代码。

从另一个角度来看,不幸的是编译器没有将其视为 AVX1 内在函数,但我猜 compilers which don't optimize intrinsics ,并且允许您使用尚未启用的 ISA 扩展中的内部函数,需要这种线索来知道它们何时可以使用 ymm16-31。

<小时/>

当您不进行屏蔽时,您甚至不希望编译器发出 vmovdqu32 ymmvmovdqu ymm 更短,并且完全做同样的事情,with no penalty for mixing with EVEX-encoded instructions 。如果编译器想要加载到 ymm16..31 中,则始终可以使用 vmovdqu3264,否则您希望它使用较短的 VEX 编码 AVX1 vmovdqu .

我很确定 GCC 对待 _mm256_maskz_epi32(0xffu,ptr)_mm256_loadu_si256((const __m256i*)ptr) 完全相同,并且无论如何都会生成相同的汇编您使用哪一个。它可以优化 0xffu 掩码并简单地使用未掩码的负载,但您的源代码中不需要这种额外的复杂性。

但不幸的是,当启用 AVX512VL(例如 -march=skylake-avx512)时,即使您编写 ,GCC9 及更早版本也会悲观到 vmovdqu32 ymm0, [mem] >_mm256_loadu_si256。这是一个错过的优化, GCC Bug 89346

只要没有屏蔽,您使用哪种 256 位加载内在函数(对齐与未对齐除外)并不重要。

相关:

关于c++ - 如何使用 gcc 或 clang 模拟 _mm256_loadu_epi32?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649287/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com