其实我有2个问题:
我使用的是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
CPU需要能够执行SSE2指令,并且编译器需要能够生成它们。
检查您的CPU是否支持SSE2:
# cat /proc/cpuinfo
如果支持的话,它将位于“flags”下的某个位置。
更新:所以你的CPU不支持它。
对于编译器:
# gcc -dumpmachine
# gcc --version
你的编译器的目标需要是一种 x86*,因为只有这个 cpu 支持 sse2,它是 x86 指令集的一部分
和
gcc 版本需要>= 3.1(很可能,因为这已经有大约 10 年历史了)才能支持 SSE2。
更新:所以你的编译器在此目标上不支持它,如果你将它用作 x86 的交叉编译器,它会支持它。
另一个尚未提及的技巧是:
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
两者都是。编译器/汇编器需要能够发出/处理SSE2指令,然后CPU需要支持它们。如果您的二进制文件具有不附加任何条件的 SSE2 指令,并且您尝试在 Pentium II 上运行它,那么您就不走运了。
最好的方法是检查你的 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 发行版(当然没有虚拟化)。不过,您绝对不会对由此产生的速度感到眼花缭乱。
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;
}
lshw -class processor | grep -w sse2
然后查看处理器部分。