nev*_*int 14 unix linux compiler-construction itanium sse2
其实我有两个问题:
我正在使用GCC版本:
gcc (GCC) 4.5.1
Run Code Online (Sandbox Code Playgroud)
当我尝试编译代码时,它给了我这个错误:
$ gcc -O3 -msse2 -fno-strict-aliasing -DHAVE_SSE2=1 -DMEXP=19937 -o test-sse2-M19937 test.c
cc1: error: unrecognized command line option "-msse2"
Run Code Online (Sandbox Code Playgroud)
并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
Run Code Online (Sandbox Code Playgroud)
Gun*_*iez 14
CPU需要能够执行SSE2 instrcutions,并且编译器需要能够生成它们.
要检查你的cpu是否支持SSE2:
# cat /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)
如果支持它,它将在"标志"下的某个地方.
更新:所以你的cpu不支持它.
对于编译器:
# gcc -dumpmachine
# gcc --version
Run Code Online (Sandbox Code Playgroud)
你的编译器的目标需要一种x86*,因为只有这个cpus支持sse2,它是x86指令集的一部分
和
gcc版本需要> = 3.1(最有可能,因为这是大约10年或其他什么)来支持SSE2.
更新:所以你的编译器不支持它在这个目标上,如果你将它用作x86的交叉编译器.
这两者都是.编译器/汇编器需要能够发出/处理SSE2指令,然后CPU需要支持它们.如果您的二进制文件没有附加条件的SSE2指令,并且您尝试在Pentium II上运行它,则运气不佳.
最好的方法是检查您的GCC手册.例如,我的GCC联机帮助页指的是-msse2选项,它允许您在二进制文件中显式启用SSE2指令.任何相对较新的GCC或ICC都应该支持它.至于你的cpu,请检查/ proc/cpuinfo中的标志行.
但是,最好使用cpuid等对代码进行检查,以便在不支持它的CPU中禁用SSE2部分,并且您的代码可以回退到更常见的指令集.
编辑:
请注意,您的编译器需要是在x86系统上运行的本机编译器,或者是x86的交叉编译器.否则它将没有必要的选项来编译x86处理器的二进制文件,其中包括SSE2的任何东西.
在您的情况下,CPU根本不支持x86.根据您的Linux发行版,可能会有适用于IA86上x86-software的Intel IA32EL仿真层的软件包,这可能允许您运行x86软件.
因此,您有以下选择:
使用将在IA64上运行的交叉编译器并为x86生成二进制文件.交叉编译工具链虽然设置起来不是一件容易的事,因为你需要的不仅仅是编译器(binutils,库等).
使用Intel IA32EL运行本机x86编译器.我不知道如何安装本机x86工具链,您的项目所需的所有库都不直接支持它.也许是x86发行版的全面chroot安装?
然后,如果要在此系统上测试构建,则必须安装Intel的IA32EL for Linux.
EDIT2:
我想你也可以在像Bochs或QEMU这样的模拟器上运行完整的x86 linux发行版(当然没有虚拟化).尽管如此,你肯定不会被最终的速度所迷惑.
小智 6
还没有提到的另一个技巧是:
gcc -march=native -dM -E - </dev/null | grep SSE2
Run Code Online (Sandbox Code Playgroud)
得到:
#define __SSE2_MATH__ 1
#define __SSE2__ 1
Run Code Online (Sandbox Code Playgroud)
使用-march = native,您正在检查编译器和CPU.如果为特定CPU提供不同的-march,例如-march = bonnell,则可以检查该CPU.
有关正确版本的gcc,请参阅gcc文档:
https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Submodel-Options.html