如何测试你的Linux支持SSE2

其实我有两个问题: SSE2兼容性是CPU问题还是编译器问题? 如何检查您的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
    
已邀请:
这两者都是。编译器/汇编器需要能够发出/处理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发行版(当然没有虚拟化)。尽管如此,你肯定不会被最终的速度所迷惑。     
CPU需要能够执行SSE2 instrcutions,并且编译器需要能够生成它们。 要检查你的cpu是否支持SSE2:
# cat /proc/cpuinfo
如果支持它,它将在“标志”下的某个地方。 更新:所以你的cpu不支持它。 对于编译器:
# gcc -dumpmachine
# gcc --version
你的编译器的目标需要一种x86 *,因为只有这个cpus支持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     
使用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;
}
    
试试跑步:
lshw -class processor | grep -w sse2
并查看处理器部分。     

要回复问题请先登录注册