C++ Intrinsic 未声明

Posted

技术标签:

【中文标题】C++ Intrinsic 未声明【英文标题】:C++ Intrinsic not declared 【发布时间】:2013-07-09 13:36:33 【问题描述】:

我正在学习使用内在函数而不是 asm 内联。昨天,他们正在工作,但我今天总是出错。什么都没改变。

#include <iostream>
#include <intrin.h> // immintrin.h, smmintrin.h ... tried all, never worked

using namespace std;

    int main()
    
        _m256_zeroupper(); // __mm256_zeroupper(); does not work too
        _mm128 x; // __mm128 x; does not work too
        _mm256 y; // __mm256 y; does not work too
        _m256_zeroupper(); // __mm256_zeroupper();  does not work too
        cout << "Hello world!" << endl;
        return 0;
    

这里是错误。我尝试了不同内在函数的所有头文件,但错误是相同的。还重新安装了 gcc,但没有工作。

我哪里错了?我需要添加什么来实际声明这些内在变量和函数?

C:\indirmeDenemesi\hello_intrin\main.cpp||In function 'int main()':|
C:\indirmeDenemesi\hello_intrin\main.cpp|8|error: '_mm256_zeroupper' was not declared in this scope|
C:\indirmeDenemesi\hello_intrin\main.cpp|9|error: '_mm128' was not declared in this scope|
C:\indirmeDenemesi\hello_intrin\main.cpp|9|error: expected ';' before 'x'|
C:\indirmeDenemesi\hello_intrin\main.cpp|10|error: '_mm256' was not declared in this scope|
C:\indirmeDenemesi\hello_intrin\main.cpp|10|error: expected ';' before 'y'|
||=== Build finished: 5 errors, 0 warnings (0 minutes, 0 seconds) ===|

在 64 位 cpu 和 64 位窗口上使用 64 位最新版本的 gcc。 CPU是FX8150。 试过 -march=bdver1 -mtune=bdver1 ,它产生了数百个垃圾错误。

所有这些是否意味着我的 CPU 快要死了?

编辑:其他一些项目现在正在运行,但我没有改变任何东西。这必须是特定于项目的事情。 使用 code::blocks 并且当我右键单击标题并选择“打开”时,它会给出错误“找不到”但在编译时不会给出任何错误,只是 intrinsinc 命令的错误。工作项目也一样(他们编译一切并工作,但右键单击并单击打开时找不到头文件)。也许其他一些 Windows 服务正在干扰?我不知道,但编译器错误会不时消失并再次出现。重新安装代码块也没有解决。只有一些项目可以使用内在函数,而其他项目不能(即使所有项目都有相同的标头。)

下面这段代码也不行。

#include <iostream>
#include <immintrin.h>
using namespace std;

int main()

    _m256_zeroupper();

    __mm128 x;

    __mm256 y;

    _m256_zeroupper();
    cout << "Hello world!" << endl;
    return 0;

【问题讨论】:

您使用什么编译器选项?您是否启用了正确的处理器类型? 请记住,编译器内在函数是非常特定于编译器的。检查 the online documentation 以了解 GCC 中针对其目标的可用功能。 FX-8150 试过 -march=bdver1 -mtune=bdver1 却产生了数百个垃圾错误。 如何启用 avx 让它从标头声明 avx? 最新版本的 gcc 和 clang(以及 ICC)提升了 &lt;immintrin.h&gt; 标头,对函数使用 _mm 前缀,对变量使用 __m256 【参考方案1】:

三件事应该让你的代码工作:

    确保您使用的是 -mavx 编译标志。

    您的变量应声明为__m256 而不是_mm256

    确保包含immintrin.h

【讨论】:

或者更好,-march=native-march=haswell,而不仅仅是 -mavx。另请参阅***.com/questions/38662287/… re: gcc 的 tune=generic 将未对齐的 256b 加载/存储拆分为 movdqu / vinsertf128。或者使用-mavx -mno-avx256-split-unaligned-load -mno-avx256-split-unaligned-store,除非您实际上正在针对 SnB 进行调整,并且您的数据实际上大部分时间都是未对齐的。

以上是关于C++ Intrinsic 未声明的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中声明、操作和访问未对齐的内存 [关闭]

未声明 Visual c++ 标识符

C++ 对象未声明标识符

如何修复这个未声明的标识符? (C++)

win32 C++ 打印 PRINTDLGEX 未声明?

C++ 编程错误 |未声明的标识符