SSE指令集未启用。

12

我遇到了这个错误:"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()

3
你忘了提到在收到错误信息时你试图做什么。 - Matti Virkkunen
8
尝试将“-msse”传递给GCC。根据您的需要,可以使用“-msse2”,“-msse3”或其他选项。 - Mysticial
2
你尝试过使用gcc标志-march=native或-msse2 / -msse3 / -mssse3 / -msse4.1吗? - Kris
AVX是SSE的独占特性吗? - Mikhail
GCC默认为64位x86_64代码启用SSE2。您是否使用64位操作系统进行编译(CMake应在64位操作系统上默认为64位)?此外,诸如“SSE4_2_FOUND”之类的标签不是CMAKE的标准部分。您是否自己定义了它们?如果您正在编译32位代码,则需要至少添加“-msse2”。 - Z boson
3个回答

6

你的头文件之一检查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。我也是这么做的。更重要的是,如果我在包含此文件之前定义了SSE2、SSE和MMX,我会得到以下消息:warning: "SSE2" redefined [enabled by default]
所以我试图调查SSE2在哪里被定义和/或使用,我发现这个文件被x86intrin.h包含。因此,包含此文件并根据-msse*标志自动包含适当的*intrin.h文件!
对我来说很好用(g++ 4.7.2-5)。
希望我能帮到你!

1

我只是在FreeBSD上构建了这个功能,通过在/usr/ports/audio/soundtouch的"Makefile"中添加以下内容:

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

我希望“phonon-gstreamer”插件的其余部分能够通过编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接