16

其实我有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
4

5 回答 5

18

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

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

# cat /proc/cpuinfo

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

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

对于编译器:

# gcc -dumpmachine
# gcc --version

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

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

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

于 2010-11-17T10:02:02.147 回答
7
  1. 两者都是。编译器/汇编器需要能够发出/处理 SSE2 指令,然后 CPU 需要支持它们。如果您的二进制文件包含没有附加条件的 SSE2 指令,并且您尝试在 Pentium II 上运行它,那么您就不走运了。

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

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

编辑:

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

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

因此,您有以下选择:

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

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

然后,如果你想在这个系统上测试你的构建,你必须安装 Intel 的 IA32EL for Linux。

编辑2:

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

于 2010-11-17T10:08:58.760 回答
7

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

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

于 2017-08-14T05:28:42.527 回答
3

尝试运行:

lshw -class processor | grep -w sse2

并查看处理器部分。

于 2010-11-17T10:38:36.850 回答
3

使用 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;
}
于 2011-01-04T07:21:31.980 回答