【问题标题】:_mm256_store_epi32 was not declared [duplicate]_mm256_store_epi32 未声明[重复]
【发布时间】:2020-08-02 10:11:13
【问题描述】:

基本上,我的程序是这样的:

#include <immintrin.h>
...
int* buf = (int*)_mm_malloc(sizeof(int) * 8, 32);
__m256i vi;
//some operations on vi
...
_mm256_store_epi32(buf, vi);
_mm_free(buf)

编译器在构建程序时抱怨“错误:'_mm256_store_epi32' 未在此范围内声明...注意:建议的替代方案:'_mm256_store_epi64'”在构建程序时(带有标志-mavx -mavx2)。令我困惑的是,一旦替换为_mm256_store_epi64,它就编译成功了。我的 gcc 版本是 7.5.0。
here 发布了一个类似的问题,但没有帮助。任何人都可以提供任何解决方法吗?

【问题讨论】:

    标签: c++ gcc intrinsics avx avx512


    【解决方案1】:

    根据内在指南 (https://software.intel.com/sites/landingpage/IntrinsicsGuide/#text=_mm256_store_epi32&expand=5573,5567,5567,5567) _mm256_store_epi32 intrinsic 需要这些 CPUID 标志:AVX512VL + AVX512F。

    您是否应该使用-mavx512vl -mavx512f 来使这个内在函数可用(前提是您的硬件目标支持它)。

    【讨论】:

    • 嗨,我的标志是-msse -msse2 -msse3 -msse4 -msse4a -mavx -mavx2 -mavx512vl -mavx512f -std=c++11 ,但它也不起作用
    • @Finley:可能不是所有编译器都费心提供奇怪的_mm256_store_epi32 AVX512 内在函数,因为它比_mm256_store_si256 没有优势(除了更好的原型:void* arg 而不是__m256i* )。见How to emulate _mm256_loadu_epi32 with gcc or clang?。无论哪种方式,您都希望它编译为 vmovdqa [mem], ymm,而不是 2 字节大的 vmovqa32 [mem], ymm
    • @PeterCordes _mm256_store_si256 工作,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 2018-02-20
    • 1970-01-01
    • 2021-08-29
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多