如何测试你的Linux是否支持SSE2

问题描述 投票:0回答:5

其实我有2个问题:

  1. SSE2 兼容性是 CPU 问题还是编译器问题?
  2. 如何检查您的CPU或编译器是否支持SSE2?

我使用的是GCC版本:

gcc (GCC) 4.5.1

当我尝试编译代码时,它给了我这个错误:

$ gcc -O3 -msse2 -fno-strict-aliasing -DHAVE_SSE2=1 -DMEXP=19937 -o test-sse2-M19937 test.c
cc1: error: unrecognized command line option "-msse2"

并且

cpuinfo
显示了这个:

processor  : 0
vendor     : GenuineIntel
arch       : IA-64
family     : 32
model      : 1
model name : Dual-Core Intel(R) Itanium(R) Processor 9140M
revision   : 1
archrev    : 0
features   : branchlong, 16-byte atomic ops
cpu number : 0
cpu regs   : 4
cpu MHz    : 1669.000503
itc MHz    : 416.875000
BogoMIPS   : 3325.95
siblings   : 2
physical id: 0
core id    : 0
thread id  : 0
linux unix sse2 itanium
5个回答
21
投票

CPU需要能够执行SSE2指令,并且编译器需要能够生成它们。

检查您的CPU是否支持SSE2:

# cat /proc/cpuinfo

如果支持的话,它将位于“flags”下的某个位置。

更新:所以你的CPU不支持它。

对于编译器:

# gcc -dumpmachine
# gcc --version

你的编译器的目标需要是一种 x86*,因为只有这个 cpu 支持 sse2,它是 x86 指令集的一部分

gcc 版本需要>= 3.1(很可能,因为这已经有大约 10 年历史了)才能支持 SSE2。

更新:所以你的编译器在此目标上不支持它,如果你将它用作 x86 的交叉编译器,它会支持它。


8
投票

另一个尚未提及的技巧是:

gcc -march=native -dM -E - </dev/null | grep SSE2

并得到:

#define __SSE2_MATH__ 1
#define __SSE2__ 1

使用 -march=native 您可以检查编译器和 CPU。如果您为特定 CPU 提供不同的 -march,例如 -march=bonnell,您可以检查该 CPU。

请参阅您的 gcc 文档以获取正确的 gcc 版本:

https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Submodel-Options.html


7
投票
  1. 两者都是。编译器/汇编器需要能够发出/处理SSE2指令,然后CPU需要支持它们。如果您的二进制文件具有不附加任何条件的 SSE2 指令,并且您尝试在 Pentium II 上运行它,那么您就不走运了。

  2. 最好的方法是检查你的 GCC 手册。例如,我的 GCC 手册页引用了 -msse2 选项,该选项允许您在二进制文件中显式启用 SSE2 指令。任何相对较新的 GCC 或 ICC 都应该支持它。至于你的CPU,检查/proc/cpuinfo中的标志行。

不过,最好使用 cpuid 等检查您的代码,以便可以在不支持 SSE2 部分的 CPU 中禁用 SSE2 部分,并且您的代码可以退回到更常见的指令集。

编辑:

请注意,您的编译器必须是在 x86 系统上运行的本机编译器,或者是 x86 的交叉编译器。否则,它将没有必要的选项来编译 x86 处理器的二进制文件,其中包括 SSE2 的任何内容。

在您的情况下,CPU 根本不支持 x86。根据您的 Linux 发行版,可能有包含用于 x86-software-on-IA64 的 Intel IA32EL 模拟层的软件包,这可能允许您运行 x86 软件。

因此您有以下选择:

  • 使用将在 IA64 上运行并生成 x86 二进制文件的交叉编译器。不过,交叉编译器工具链的设置并不容易,因为您需要的不仅仅是编译器(binutils、库等)。

  • 使用 Intel IA32EL 运行本机 x86 编译器。我不知道您将如何安装本机 x86 工具链,并且您的项目在发行版中所需的所有库都不直接支持它。也许是 x86 发行版的完整 chroot 安装?

然后,如果您想在此系统上测试您的构建,您必须安装适用于 Linux 的 Intel IA32EL。

编辑2:

我想您也可以在 Bochs 或 QEMU 等模拟器上运行完整的 x86 Linux 发行版(当然没有虚拟化)。不过,您绝对不会对由此产生的速度感到眼花缭乱。


3
投票

enter code here static bool HaveSSE2() { return false; __asm mov EAX,1 ; __asm cpuid ; __asm test EDX, 4000000h ;test whether bit 26 is set __asm jnz yes ;yes return false; yes: return true; }



3
投票

lshw -class processor | grep -w sse2

然后查看处理器部分。

© www.soinside.com 2019 - 2024. All rights reserved.