如何testing你的Linux支持SSE2

其实我有两个问题:

  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 

  1. 这是两个。 编译器/汇编器需要能够发出/处理SSE2指令,然后CPU需要支持它们。 如果你的二进制文件没有附加条件的SSE2指令,而你试图在Pentium II上运行它,那么你是不好运的。

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

不过最好是使用cpuid等检查你的代码,这样SSE2部分可以在不支持它的CPU中被禁用,你的代码可以在一个更常见的指令集上回落。

编辑:

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

在你的情况下,CPU根本不支持x86。 根据您的Linux发行版,可能会有x86 IA-x86上的IA32EL仿真层的软件包,这可能允许您运行x86软件。

因此,您有以下选择:

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

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

那么如果你想在这个系统上测试你的版本,你必须安装英特尔的IA32EL for Linux。

EDIT2:

我想你也可以在仿真器Bochs或QEMU上运行完整的x86 linux发行版(当然没有虚拟化)。 尽管如此,你绝对不会被这个速度所迷惑。

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

要检查你的CPU是否支持SSE2:

 # cat /proc/cpuinfo 

如果支持,它将在“旗帜”之下。

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

对于编译器:

 # gcc -dumpmachine # gcc --version 

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

为了支持SSE2,gcc版本需要大于或等于3.1(最有可能的,因为这大概是10年左右)。

更新:所以你的编译器不支持在这个目标上,如果你使用它作为x86的交叉编译器的话。

使用asm来检查sse2的存在

 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; } 

还没有提到的另一个窍门是:

 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

尝试运行:

 lshw 

并查看处理器部分。