2010-11-17 60 views
10

其實我有2個問題:如何測試,如果你的Linux支持SSE2

  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 
+0

您使用的是默認情況下有針對性地IA64一個GCC。 IA64指令集與x86的指令集完全不同。如果你想爲x86編譯,你需要基本上交叉編譯你的二進制文件。 – thkala 2010-11-17 10:21:03

+7

您還有一個Itanium2處理器,它沒有x86指令集的本機支持。即使你爲X86交叉編譯你的二進制文件,在這個系統上測試它也很困難,如果不是不可能的話。 – thkala 2010-11-17 10:24:40

+0

你用什麼Linux發行版? – thkala 2010-11-17 10:36:55

回答

6
  1. 這是兩個。編譯器/彙編器需要能夠發出/處理SSE2指令,然後CPU需要支持它們。如果你的二進制文件沒有附加條件的SSE2指令,並且你試圖在Pentium II上運行它,那麼你運氣不好。

  2. 最好的方法是檢查你的GCC手冊。例如,我的GCC手冊頁引用了-msse2選項,它將允許您明確啓用二進制文件中的SSE2指令。任何相對較新的GCC或ICC都應該支持它。至於你的CPU,請檢查/ proc/cpuinfo中的標誌行。

這將是最好的,不過,在使用CPUID等你的代碼檢查,使SSE2部分可以在CPU上禁用不支持它,你的代碼可以依靠一種較爲常見的指令集。

編輯:

請注意,你的編譯器需要或者是一個x86的系統上運行的本地編譯器或交叉編譯器用於x86。否則,它將沒有必要的選項來編譯x86處理器的二進制文件,其中包括任何帶有SSE2的文件。

在你的情況下,CPU根本不支持x86。根據您的Linux發行版,可能會有x86 IA-x86-IA64上的IA32EL仿真層的軟件包,這可能允許您運行x86軟件。

因此,你有以下幾種選擇:

  • 使用交叉編譯器將在IA64運行併產生二進制文件86。交叉編譯器工具鏈並不是一件容易的事情,因爲你需要的不僅僅是編譯器(binutils,庫等)。

  • 使用Intel IA32EL運行本機x86編譯器。我不知道如何安裝本地x86工具鏈,並且您的項目在您的發行版中需要的所有庫都不直接支持它。也許是一個全面的chroot安裝的x86發行版?

然後,如果你想在這個系統上測試你建立你的安裝英特爾的ia32el程序的Linux版本。

EDIT2:

我想你也可以運行在類似Bochs的或QEMU仿真器一個完整的x86 Linux發行版(不帶虛擬化的課程)。你肯定是而不是,但由此產生的速度會讓人眼花繚亂。

+0

謝謝。請參閱上面的更新。你如何檢查標誌,我上面的cpu信息似乎沒有顯示。 – neversaint 2010-11-17 10:14:52

10

CPU需要能夠執行SSE2的指令,編譯器必須ds能夠生成它們。

要檢查你的CPU是否支持SSE2:

# cat /proc/cpuinfo 

這將是在「標誌」的地方如果支持。

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

對於編譯器:

# gcc -dumpmachine 
# gcc --version 

你的編譯器的目標,需要的是一種86 *的,因爲只有這個CPU支持SSE2,這是x86指令集的一部分

爲了支持SSE2,gcc版本需要大於等於3.1(最有可能,因爲這大概10歲左右)。

更新:所以你的編譯器不支持它在這個目標上,它會,如果你使用它作爲x86的交叉編譯器。

+0

我認爲在GCC-3.1中引入了SSE/SSE2 – thkala 2010-11-17 10:28:20

+0

是的,你是正確的:http:// gcc。gnu.org/gcc-3.1/changes.html。我已經更新了我的答案。 – hirschhornsalz 2010-11-17 10:35:31

+0

'grep -o sse2/proc/cpuinfo'非常有用,因爲在某些CPU上有很多標記需要通過眼睛來查看。 – 2017-08-18 15:39:25

1

嘗試運行:

lshw 

,並期待下的處理器部分。

+0

做到了,真的嗎? -1 – osgx 2010-11-17 11:15:58

+0

好吧,也許不是一切,但公平的份額 – 2010-11-17 11:36:26

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; 
} 
+0

這看起來像MSVC的asm語法,所以你不能在Linux上輕鬆使用它。作爲第一條語句,它看起來也有錯誤,並帶有「return false;'。將'yes:'標籤放在asm語句中會更「乾淨」;這看起來像從一個asm語句跳到C標籤,使得編譯器的生活更加困難。可能最好只是將該位提取爲true/false布爾值而不是使用條件分支。 – 2017-08-18 15:43:40

3

沒有提到的另一個竅門是做:

gcc -march=native -dM -E - </dev/null | grep SSE2 

,並得到:

#define __SSE2_MATH__ 1 
#define __SSE2__ 1 

隨着-march =本地您正在檢查你的編譯器和你的CPU。如果你爲特定的CPU提供了不同的-march,比如-march = bonnell,你可以檢查那個CPU。

,請諮詢您的gcc文檔海合會的正確版本:

https://gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Submodel-Options.html

+0

如何關閉SSE2? – 2017-11-29 01:44:42

相關問題