2013-03-22 16 views
7

Próbuję dowiedzieć się, jak ustawić odpowiednio opcję -march, aby zobaczyć, jak duża różnica w wydajności pomiędzy włączoną i wyłączoną opcją może wystąpić na moim komputerze z gcc 4.7.2.Jakie są właściwe opcje specyficzne dla architektury (-m) dla Pentium opartego na Sandy Bridge?

Przed próbą kompilacji, próbowałem znaleźć najlepszą opcję -march na moim komputerze. Mój komputer ma Pentium G850, którego architekturą jest Sandy Bridge. Tak więc odniosłem się do the gcc 4.7.2 manual i okazało się, że najlepiej wygląda -march=corei7-avx.
Jednak przypomniałem sobie, że Pentium oparty na Sandy Bridge nie ma obsługi zestawu instrukcji AVX i AES-NI, która jest true for Pentium G850. Tak więc -march=corei7-avx nie jest odpowiednią opcją.

wymyślić niektórych potencjalnych opcji:

  1. -march=corei7-avx -mno-avx -mno-aes
  2. -march=corei7 -mtune=corei7-avx
  3. -march=native

Pierwsza opcja wygląda rozsądne biorąc pod uwagę informacje mam, ale jestem niespokojny, że nie może brakować funkcji innej niż AVX i AES-NI. Druga opcja wygląda bezpiecznie, ale może zabraknąć drobnych elementów na Sandy Bridge z powodu -march=corei7. Trzecia opcja zajmie się wszystkimi moimi problemami, ale słyszałem, że ta opcja czasami źle interpretuje funkcje procesora, więc chciałbym wiedzieć, jak to zrobić ręcznie.
Przeszukałem go i przeszukano StackOverflow i SuperUser, ale nie mogę znaleźć żadnych wyraźnych rozwiązań ...
Jakie opcje należy ustawić?

Odpowiedz

2

Proponuję użyć -march=corei7-avx -mtune=corei7-avx -mno-avx -mno-aes. Ważne jest, aby podać -mtune, ponieważ ta opcja informuje gcc, który model procesora powinien użyć do planowania instrukcji w wygenerowanym kodzie.

+0

Twoja odpowiedź wygląda tak samo jak moja pierwsza opcja, ponieważ ' -march = cpu-type' implikuje '-mtune = cpu-type' (patrz sekcja" -march = cpu-type "[podręcznika gcc] (http://gcc.gnu.org/onlinedocs/gcc-4.7. 2/gcc/i386-and-x86_002d64-Options.html # i386-and-x86_002d64-Options)). Czy jest różnica między moją pierwszą opcją a twoją? Ponadto, czy nie ma się czym martwić brakującymi funkcjami innymi niż AVX i AES-NI? –

+0

Prawdopodobnie Sandy Mosty niskiej klasy również nie posiadają instrukcji PCLMULQDQ, ale kompilator i tak nie wygeneruje go automatycznie. –

+0

Naprawdę? Myślałem, kod za pomocą takich instrukcji, jeśli kompilator wykrywa, niektóre kod jest szybciej za pomocą tego ... Czy jestem źle? –

1

Mam na przykład procesor Intel (R) Celeron (R) z procesorem Sandy Bridge G530.

Kiedy używasz -march=native w CFLAGS gentoo, a następnie kompilujesz media-video/ffmpeg-1.2.6 (obecna stabilna wersja w Gentoo), coś jest nie tak podczas odtwarzania wideo z mplayerem (nielegalna instrukcja). Tak jak powiedziałeś, -mtune=native czasami błędnie interpretuje funkcje procesora.

Potem zmieniam na -march=corei7-avx -mtune=corei7-avx -mno-avx -mno-aes i rekompiluję ffmpeg-1.2.6 i mplayera, wszystko jest ok do teraz.

5

Co o wykryciu przez GCC, dla mnie (gcc-5.3.0) na i5-2450M CPU (E520 Lenovo), następujące programy:

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1 


/usr/libexec/gcc/x86_64-pc-linux-gnu/5.3.0/cc1 -E -quiet -v - -march=sandybridge 
-mmmx -mno-3dnow -msse -msse2 -msse3 -mssse3 -mno-sse4a -mcx16 
-msahf -mno-movbe -maes -mno-sha -mpclmul -mpopcnt -mno-abm -mno-lwp 
-mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx 
-mno-avx2 -msse4.2 -msse4.1 -mno-lzcnt -mno-rtm -mno-hle -mno-rdrnd 
-mno-f16c -mno-fsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr 
-mxsave -mxsaveopt -mno-avx512f -mno-avx512er -mno-avx512cd 
-mno-vx512pf -mno-prefetchwt1 -mno-clflushopt -mno-xsavec -mno-xsaves 
-mno-avx512dq -mno-avx512bw -mno-avx512vl -mno-avx512ifma 
-mno-avx512vbmi -mno-clwb -mno-pcommit -mno-mwaitx --param 
l1-cache-size=32 --param l1-cache-line-size=64 --param 
l2-cache-size=3072 -mtune=sandybridge -fstack-protector-strong 
Powiązane problemy