【问题标题】:SSE instruction set not enabledSSE 指令集未启用
【发布时间】:2012-02-27 00:13:07
【问题描述】:

我遇到了这个错误:“SSE 指令集未启用”。我该如何解决这个问题?

我有ACER i7,Ubuntu 11.10,请任何人帮助我?

任何帮助将不胜感激!


也在运行:

 sudo cat /proc/cpuinfo | grep flags

给予:

flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clfl
ush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx rdtscp lm constant_tsc arch_perfm
on pebs bts xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl
vmx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 x2apic popcnt xsave avx lahf_lm 
ida arat epb xsaveopt pln pts dts tpr_shadow vnmi flexpriority ept vpid

其实我是在尝试安装gazebo-1.0.0-RC2-x86_64,结果出现这个错误。

/usr/lib/gcc/i686-linux-gnu/4.6.1/include/emmintrin.h:32:3: error: #error "SSE2 
instruction set not enabled"
In file included from /home/bkhelifa/Downloads/software/gazebo-1.0.0-RC2-x86_64/
deps/opende/src/quickstep.cpp:39:0:
/usr/lib/gcc/i686-linux-gnu/4.6.1/include/xmmintrin.h:32:3: error: #error "SSE i
nstruction set not enabled"
/home/bkhelifa/Downloads/software/gazebo-1.0.0-RC2-x86_64/deps/opende/src/quicks
tep.cpp: In function ‘dReal dot6(dRealPtr, dRealPtr)’:
/home/bkhelifa/Downloads/software/gazebo-1.0.0-RC2-x86_64/deps/opende/src/quicks
tep.cpp:537:3: error: ‘__m128d’ was not declared in this scope
...

我的 cmakefile 中已经有这个选项

if (SSE3_FOUND)
  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse3")
endif()
if (SSSE3_FOUND)
  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -mssse3")
endif()
if (SSE4_1_FOUND)
  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse4.1")
endif()
if (SSE4_2_FOUND)
  set (CMAKE_C_FLAGS_ALL "${CMAKE_C_FLAGS_ALL} -msse4.2")
endif()

【问题讨论】:

  • 您在收到错误消息时忘记提及您正在尝试执行的操作。
  • 尝试将-msse 传递给 GCC。 -msse2-msse3,或者你需要的任何东西。
  • 你试过 gcc 标志 -march=native 还是 -msse2 / -msse3 / -mssse3 / -msse4.1 ?
  • AVX 是 SSE 独有的吗?
  • SSE2 在 GCC 中默认为 64 位 x86_64 代码启用。您是否使用 64 位操作系统进行编译(CMake 在 64 位操作系统上应默认为 64 位)。此外,SSE4_2_FOUND 等标签也不是 CMAKE 的标准部分。 Did you define them yourself?如果您正在编译 32 位代码,那么您至少需要添加 -msse2

标签: c++ intrinsics sse2 sse3


【解决方案1】:

您的一个头文件会检查以确保已启用 SSE。您的 if 语句似乎不起作用。

如果您添加-march=native,它应该根据您的处理器选择最佳的 CPU 架构和标志进行编译,或者您可以显式使用-march=corei7 -mavx -mpclmul,这对distcc 很有用。此外,-mfpmath=sse/-mfpmath=387 将告诉编译器为浮点数学生成 SSE/x87 指令。根据您的处理器,两者都可能更快,但我认为英特尔处理器通常在 SSE 方面表现更好。

如果您想使用本机标志检查 gcc 启用的内容,请运行 gcc -march=native -Q --help=target -v

【讨论】:

    【解决方案2】:

    我遇到了同样的错误,我想我找到了正确的解决方案!

    问题是您包含在 emmintrin.h 中。我也这样做了。更重要的是,如果我在包含此文件之前定义了 SSE2SSEMMX,我会收到以下消息:警告:“SSE2" 重新定义 [默认启用]

    所以我试图调查 SSE2 是在哪里定义和/或使用的,我发现这个文件包含在 x86intrin.h 中。所以包含这个文件,根据 -msse* 标志,正确的 *intrin.h 文件将被自动包含!

    它很适合我 (g++ 4.7.2-5)。

    希望能帮到你!

    【讨论】:

      【解决方案3】:

      我刚刚在 FreeBSD 上通过将其添加到 /usr/ports/audio/soundtouch 中的“Makefile”中构建了它:

      CC=             gcc46
      CXX=            g++46
      CPP=            cpp46
      CFLAGS+=        -msse
      

      我希望其余的“phonon-gstreamer”插件可以用这个编译。

      【讨论】:

        猜你喜欢
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 2013-01-31
        • 2010-12-01
        • 2010-10-09
        • 2021-08-10
        • 1970-01-01
        • 2013-04-30
        相关资源
        最近更新 更多