只需使用_mm256_loadu_si256
像正常人一样。 AVX512 内在给您的唯一东西是一个更好的原型(const void*
代替const __m256i*
)这样你就不必编写难看的强制转换。
@chtz 建议您可能仍然想自己编写一个包装函数来获取void*
原型。但不要称呼它_mm256_loadu_epi32
;某些未来的 GCC 版本可能会添加它以与 Intel 的文档兼容并破坏您的代码。
从另一个角度来看,不幸的是编译器没有将其视为 AVX1 内在函数,但我猜不优化内在函数的编译器 https://stackoverflow.com/questions/55747789/the-effect-of-architecture-when-using-sse-avx-intrinisics,并且允许您使用尚未启用的 ISA 扩展中的内部函数,需要这种线索来知道它们何时可以使用 ymm16-31。
你甚至不希望编译器发出vmovdqu32 ymm
当你不戴口罩时;vmovdqu ymm
更短并且exactly一样的东西,与 EVEX 编码指令混合不会受到任何惩罚 https://stackoverflow.com/questions/46080327/what-is-the-penalty-of-mixing-evex-and-vex-encoded-scheme。编译器总是可以使用vmovdqu32
or 64
如果它想加载到 ymm16..31,否则你希望它使用较短的 VEX 编码 AVX1vmovdqu
.
我很确定 GCC 会对待_mm256_maskz_epi32(0xffu,ptr)
完全一样_mm256_loadu_si256((const __m256i*)ptr)
无论您使用哪一个,都会生成相同的汇编。它可以优化掉0xffu
mask 并简单地使用未屏蔽的负载,但您的源代码中不需要这种额外的复杂性。
But unfortunately GCC9 and earlier will pessimize to vmovdqu32 ymm0, [mem]
when AVX512VL is enabled (e.g. -march=skylake-avx512
) even when you write _mm256_loadu_si256
. This was a missed-optimization, GCC Bug 89346 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89346.
只要没有屏蔽,使用哪种 256 位加载内在函数(对齐与未对齐除外)并不重要。
Related:
- 错误:“_mm512_loadu_epi64”未在此范围内声明 https://stackoverflow.com/questions/53604986/error-mm512-loadu-epi64-was-not-declared-in-this-scope
- _mm512_load_epi32 和 _mm512_load_si512 有什么区别? https://stackoverflow.com/questions/53905757/what-is-the-difference-between-mm512-load-epi32-and-mm512-load-si512