Pozor, od 6. 6. 2025 bude můj web přístupný již jen v rámci skutečného Internetu – v historickém vypínám.

Můj malý svět

Obrať obličej k slunci
a stíny budou padat za tebe
  • Eko náhrady
  • Stop Heuréce
  • Zkušenosti s firmami
  • -march=native nemusí být vždy to správné řešení

    Kdo umí kompilovat s optimalizacemi na platformu či používá Gentoo Linux, se již pravděpodobně setkal s přepínačem GNU kompilátoru -march=native, který by správně měl kompilovat s použitím dostupných instrukcí a ideálních optimalizací na procesor.

    Pro úplnost citace z manuálové stránky gcc, co se píše o native u -mtune (což je přepínač mj. automaticky zapínaný při volbě -march):

    This selects the CPU to tune for at compilation time by determining the processor type of the com‐ piling machine. Using -mtune=native will produce code optimized for the local machine under the constraints of the selected instruction set. Using -march=native will enable all instruction sub‐ sets supported by the local machine (hence the result might not run on different machines).

    Člověk by si řekl, že nic lepšího si snad už ani nemůže přát. Ano, snad ano, kdyby to vždy fungovalo tak, jak člověk z výše citovaného předpokládá. Zřejmě tomu tak však není.

    Na problém jsem narazil, když jsem se pokoušel sehnat distribuci pro jeden starší kousek počítače s procesorem VIA C3 Samuel 2 (na frekvenci 800 MHz). Nic výkonného, ale s ohledem na nízkou spotřebu (celá sestava v klidu 17 W, v plné zátěži nejvýše 35 W, což je příjemné) ideální kupříkladu pro domácí server. Tento procesor by měl být typu i686, ovšem s tím, že neimplementuje instrukci cmov, která je volitelná. To s sebou nese řadu problémů, protože většina softwaru optimalizovaného pro i686 s touto instrukcí počítá. Člověk tedy musí volit optimalizace od i386 po i586 nebo si nakompilovat vlastní.

    Já jsem po peripetiích se sháněním vhodné live distribuce (nakonec fungovala starší verze Slaxu – díky za ni), vzal i486 verzi základní instalace (tj. stage3 balík) Gentoo Linuxu (ono pokud člověk nechce neustále řešit výše popsaný problém se softwarem, jehož binárky jsou pro plnou i686, tak je to asi nejlepší možná volba, ač bude muset na instalaci trošku déle čekat). Globální CFLAGS jsem nastavil právě s přepínačem -march=native, neboť jsem se chtěl vyhnout problému s chybnou optimalizací. Ironií osudu je, že jsem si ji tím paradoxně sám způsobil. Při upgradu kompilátoru gcc jsem narazil: Illegal instruction. Docela mě to vykolejilo, protože s tímhle jsem nepočítal – native tomu mělo přeci předejít, ne?

    Druhý den jsem zkusil bootstrap s tím, že nastavím tentokrát doporučené, bezpečné CFLAGS pro tento procesor. Binutils, které předtím během kompilace také zhavarovaly, tentokrát prošly bez problémů. Gcc po mnoha a mnoha hodinách také. Jediný způsob, kterým si toto chování vysvětluji, je bug v gcc při použití -march=native. Dá se tedy v obecné rovině říci, že pokud člověk má možnost použít konkrétní optimalizaci pro svůj procesor, měl by ji upřednostnit před automatickou možností native. Dost možná si ušetří pár hodin či dní kompilování.

    Pro ilustraci přikládám i dva odkazy dokládající problematičnost tohoto přepínače:

    Pro vyvážení ještě přidám i jeden poměrně užitečný článek, díky kterému se člověk dozví, co se za nativní optimalizací pro jeho počítač skrývá.

    Zaškatulkováno v kategorii: GNU/Linux | 17. srpna 2011

    Komentáře

    Jak přidat komentář? E-mailem! :·) Na komentare -zavináč- mujmalysvet -tečka- cz – do předmětu „Komentář: -march=native nemusí být vždy to správné řešení“. Připojit můžete i svou přezdívku a domovskou stránku.