调用 always_inline '_mm256_add_epi32' 时内联失败:目标特定选项不匹配 [重复]

Posted

技术标签:

【中文标题】调用 always_inline \'_mm256_add_epi32\' 时内联失败:目标特定选项不匹配 [重复]【英文标题】:inlining failed in call to always_inline '_mm256_add_epi32': target specific option mismatch [duplicate]调用 always_inline '_mm256_add_epi32' 时内联失败:目标特定选项不匹配 [重复] 【发布时间】:2019-09-26 12:26:32 【问题描述】:

我正在运行带有 SIMD 指令的 C 代码来测试我的环境。我在 Codeblocks 和 Windows 10 中运行它

#include <immintrin.h>
#include <stdio.h>

#define ARRAY_LENGTH 8

int main(int argc, char* argv[]) 

    __m256i first = _mm256_set_epi32(10, 20, 30, 40, 50, 60, 70, 80);
    __m256i second = _mm256_set_epi32(5, 5, 5, 5, 5, 5, 5, 5);
    __m256i result = _mm256_add_epi32(first, second);

    int* values = (int*) &result;

    for (
        unsigned short i = 0;
        i < ARRAY_LENGTH;
        i += 1
    ) 
        printf("%d ", values[i]);
    

    return 0;

此代码引发错误,我无法修复它。

error: inlining failed in call to always_inline '_mm256_add_epi32': target specific option mismatch

是不是 Codeblocks 环境造成的?

【问题讨论】:

【参考方案1】:

您必须通过在 gcc 命令行中添加正确的选项来本地启用相应的指令集,在这种情况下为 -mavx2,即:

gcc -O2 -mavx2 prog.c -o prog

当然,你要确保你运行程序的CPU确实支持这个指令集扩展,否则你会遇到segmentation fault非法指令 例外。

【讨论】:

我会推荐 -march=haswell-march=znver1 来调整 AVX2 CPU,并启用 FMA 和其他好东西,如 BMI2,而不是 just 使用 -mavx2但保留默认的-mtune=generic 等等。

以上是关于调用 always_inline '_mm256_add_epi32' 时内联失败:目标特定选项不匹配 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

_mm256_testc_pd、_mm256_testz_pd、_mm256_testnzc_pd 是干啥用的?

在AVX2中重现_mm256_sllv_epi16和_mm256_sllv_epi8

AVX指令使用

VC2012哪里找_mm256_pow_pd?

_mm256_movemask_epi8 到 uint64_t

带有 __256i 向量的意外 _mm256_shuffle_epi