其实我有两个问题:
我正在使用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
这是两个。 编译器/汇编器需要能够发出/处理SSE2指令,然后CPU需要支持它们。 如果你的二进制文件没有附加条件的SSE2指令,而你试图在Pentium II上运行它,那么你是不好运的。
最好的方法是检查你的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
并查看处理器部分。