2010-11-17 9 views
10

Właściwie mam 2 pytania:Jak sprawdzić, czy twój Linux Wsparcia SSE2

  1. Is SSE2 kompatybilności kwestią CPU lub Compiler problem?
  2. Jak sprawdzić, czy Twój procesor lub kompilator obsługuje SSE2?

Używam GCC wersja:

gcc (GCC) 4.5.1 

Kiedy próbowałem skompilować kod dać mi ten błąd:

$ gcc -O3 -msse2 -fno-strict-aliasing -DHAVE_SSE2=1 -DMEXP=19937 -o test-sse2-M19937 test.c 
cc1: error: unrecognized command line option "-msse2" 

I cpuinfo pokazał to:

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

Używasz GCC, który jest ukierunkowany na IA64 domyślnie. Zestaw instrukcji IA64 radykalnie różni się od zestawu instrukcji x86. Jeśli chcesz skompilować x86, musisz zasadniczo skompilować plik binarny. – thkala

+7

Masz również procesor Itanium2, który nie ma natywnego wsparcia dla zestawu instrukcji x86. Nawet jeśli skompilujesz plik binarny dla x86, testowanie go w tym systemie będzie trudne, jeśli nie niemożliwe. – thkala

+0

Jakiej dystrybucji Linuksa używasz? – thkala

Odpowiedz

6
  1. Oboje. Kompilator/asembler musi być w stanie emitować/obsługiwać instrukcje SSE2, a następnie CPU musi je wspierać. Jeśli twój plik binarny ma instrukcje SSE2 bez żadnych warunków i próbujesz uruchomić go na Pentium II, masz pecha.

  2. Najlepszym sposobem jest sprawdzenie instrukcji GCC. Na przykład moja strona podręcznika GCC odnosi się do opcji -msse2, która pozwoli ci jawnie włączyć instrukcje SSE2 w plikach binarnych. Każdy względnie niedawny GCC lub ICC powinien go wspierać. Jeśli chodzi o procesor, sprawdź linię flag w/proc/cpuinfo.

Byłoby najlepiej, chociaż, aby mieć kontrole w kodzie przy użyciu CPUID itp, tak że odcinki SSE2 można wyłączyć w procesorach, które nie obsługują go i kod może spaść z powrotem na więcej wspólnego zestawu instrukcji .

EDIT:

pamiętać, że kompilator musi być albo natywny kompilator działa na systemie x86 lub cross-kompilator dla x86. W przeciwnym razie nie będzie zawierał niezbędnych opcji kompilowania plików binarnych dla procesorów x86, które obejmują wszystko z SSE2.

W twoim przypadku procesor nie obsługuje w ogóle x86. W zależności od twojej dystrybucji Linuksa mogą istnieć pakiety z warstwą emulacji Intel IA32EL dla x86-software-on-IA64, które mogą pozwolić ci na uruchamianie oprogramowania x86.

Dlatego masz następujące opcje:

  • używać cross-kompilator, który będzie działał na platformie IA64 i produkować pliki binarne dla x86. Przeciąganie krzyżowe zestawów narzędzi nie jest jednak łatwe, ponieważ potrzebujesz czegoś więcej niż tylko kompilatora (binutils, biblioteki itp.).

  • Użyj Intel IA32EL do uruchomienia natywnego kompilatora x86. Nie wiem, w jaki sposób zainstalowałbyś natywny toolchain x86, a wszystkie biblioteki, których potrzebuje twój projekt w twoich dystrybucjach, nie obsługują go bezpośrednio. Być może pełna chroot'ed instalacja dystrybucji x86?

Następnie, jeśli chcesz przetestować budować na tym systemie masz instalowania Intela IA32EL dla systemu Linux.

EDIT2:

Przypuszczam, że można również uruchomić pełną dystrybucję x86 Linux na emulatorze jak Bochs lub QEMU (bez wirtualizacji oczywiście). Jesteś zdecydowanie nie będzie oślepiony przez wynikowe prędkości.

+0

dzięki. Pls patrz aktualizacja powyżej. W jaki sposób sprawdzasz flagi, powyższe informacje na temat cpu wydają się tego nie pokazywać. – neversaint

10

Procesor musi mieć możliwość wykonania instrukcji SSE2, a kompilator nie. ds, aby móc je wygenerować.

Aby sprawdzić, czy procesor obsługuje SSE2:

# cat /proc/cpuinfo 

To będzie gdzieś pod „flagi”, jeśli jest obsługiwany.

Aktualizacja: Więc procesor CPU go nie obsługuje.

dla kompilatora:

# gcc -dumpmachine 
# gcc --version 

docelowa kompilator potrzebuje pewnego rodzaju x86 *, ponieważ tylko tym procesorów wsparcia SSE2, która jest częścią instrukcji x86 ustawić

I

Wersja gcc musi być> = 3.1 (najprawdopodobniej, ponieważ ma około 10 lat lub coś w tym stylu) do obsługi SSE2.

Aktualizacja: Twój kompilator nie obsługuje tego celu, będzie użyty jako kompilator crossowy dla x86.

+0

Myślę, że obsługa SSE/SSE2 została wprowadzona w GCC-3.1 – thkala

+0

Tak, masz rację: http: // gcc.gnu.org/gcc-3.1/changes.html. Zaktualizowałem swoją odpowiedź. – hirschhornsalz

+0

'grep -o sse2/proc/cpuinfo' jest użyteczne, ponieważ istnieje wiele flag do przejrzenia oka na niektórych procesorach. –

1

spróbuj uruchomić:

lshw 

i poszukaj w sekcji procesora.

+0

to prawda? -1 – osgx

+0

ok, może nie wszystko, ale sprawiedliwy udział –

3

Zastosowanie ASM sprawdzić istnienie 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

To wygląda jak składnia MSVC asm, więc nie możesz z łatwością używać go na Linuksie. Wygląda też na błędną, z "return false;" jako pierwszą instrukcją. Byłoby "czystsze" umieszczenie etykiety 'yes:' wewnątrz instrukcji ASM; wygląda to jak przeskakiwanie do etykiety C z oświadczenia asm, co utrudnia życie kompilatora. Prawdopodobnie najlepiej jest po prostu wyodrębnić ten bit do wartości true/false boolean zamiast używać gałęzi warunkowej. –

3

Kolejna sztuczka nie jest jeszcze wymienić należy:

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

a otrzymasz:

#define __SSE2_MATH__ 1 
#define __SSE2__ 1 

Z -march = rodzimy ty sprawdzają zarówno twój kompilator, jak i procesor. Jeśli podasz inny -march dla konkretnego procesora, np. -march = bonnell, możesz sprawdzić dla tego procesora.

Consult gcc docs dla poprawnej wersji gcc:

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

+0

Jak mogę dezaktywować SSE2? –

Powiązane problemy