måndag 14 november 2016

Kompileringsflaggor till Raspberry Pi

Jag försöker lista ut vilka GCC-flaggor man bör köra mot Raspberry Pi och vad som kan förbättra prestandan. Många är av åsikten att man inte köper en Raspberry för att få prestanda och att optimeringar därför är överflödigt. Personligen anser jag att ju simplare ett system är, desto mer finns det att hämta ur optimeringar. Dessutom kan man dra nytta av att systemet är slutet genom att det går att reproducera alla resultat.

I GCC finns det ett antal flaggor som jag valt att ta en titt på.
-pipe
-march
-mcpu
-mtune
-mfloat-abi
-mfpu
-O0
-O1
-O2
-O3
-Ofast
-Os

-fsched2-use-superblocks
-fira-hoist-pressure <- kan ge mindre kod, används i Os
-fira-loop-pressure <- används kanske vid O3
-fira-region= one för O1 Os, mixed för O2/O3, all ska prövas
-funsafe-loop-optimizations
-fmodulo-sched
-fmodulo-sched-allow-regmoves
-fgcse-sm
-fgcse-las
-fgcse-after-reload
-fmerge-all-constants

-fprofile-use path <- gör funroll loops och liknande! Path är inte obligatorisk


-pipe
Denna flaggan påverkar inte slutresultatet utan gör endast att GCC jobbar med pipes istället för temporära filer. Resultatet är att man får mindre diskaccess men betalar med ram.
Så länge GCC inte kraschar av brist på ram är -pipe att föredra, då det snabbar upp kompileringen. Särskilt på Raspberryn som har ett långsamt filsystem.

-march
Sätter vilken arkitektur GCC kompilerar för, detta avgör vilka assemblerinstruktioner som är tillåtna i slutbinären.
Exempelvis kan man kompilera för armv6, armv6j eller armv6zk. armv6j står för Jazelle, hårdvara för java. Enligt ARMs hemsida ger ARM1176JZF-S stöd för armv6k-extensions som inte ARM1176JF-S har. Läser man en mailinglista från GCC-utvecklare ska inget skilja mellan armv6zk och tidigare modeller från en kompilators perspektiv. Så armv6 borde ge precis samma prestanda som armv6j eller armv6zk.

-mcpu
Specificerar ännu striktare än -march, inte bara arkitektur utan även en specifik CPU. På detta sätt kan GCC optimera efter just den processorn man använder.
Processorn som sitter i Raspberry Pi heter ARM1176JZF-S, där F står för floating point. I GCC specificeras följande modeller inom Arm11:
‘arm1136j-s’, ‘arm1136jf-s’, ‘mpcore’, ‘mpcorenovfp’, ‘arm1156t2-s’, ‘arm1156t2f-s’, ‘arm1176jz-s’, ‘arm1176jzf-s’, den sista är den som sitter i Raspberry Pi

-mtune
Denna flagga optimerar efter en viss processor utan att begränsa instruktionsrymden till endast den processorn.
Exempelvis skulle man kunna köra -march i386 med mtune för Pentium 3 och på så sätt göra koden körbar på alla processorer som stöder i386, men optimera för Pentium 3.

-mfpu
Specificerar vilken FPU som finns tillgänglig. För Raspberry Pi finns endast vfp som alternativ.

-mfloat-abi
Ställer hur flyttalsoperationer ska utföras. Ska stå på hard för att Raspberryns VFP ska utnyttjas.

-O0
Optimering avslaget, detta är default

-O1
Lägsta nivån av optimering. Många optimeringar som ökar hastigheten utan att öka storleken, samt storleksreducerande optimeringar är aktiverade.

-Os
Tar alla storleksreducerande optimeringar från O2 plus några extra. Slutmålet är minsta möjliga binär

-O2
Som O1, fast mer av det goda. O2 tar längre tid att kompilera än O1.

-O3
Tillåter även kompileringar som ger större binärer. Risken med O3 är att den större och snabbare binären kan gå långsammare på grund av att mindre får plats i cache.

-Ofast
Som O3, fast med ytterligare ett par optimeringar (bland annat -ffast-math, Fortran-specific, -fno-protect-parens och -fstack-arrays). Är inte längre ISO/IEEE-kompatibel.

Källor:
http://www.arm.com/products/processors/classic/arm11/arm1176.php
http://infocenter.arm.com/help/topic/com.arm.doc.ddi0301h/DDI0301H_arm1176jzfs_r0p7_trm.pdf
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0301h/apbs02s02.html
http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
http://en.wikipedia.org/wiki/ARM11
http://gcc.gnu.org/ml/gcc-patches/2004-09/msg03073.html

Benchmarks:
https://github.com/ssvb/tinymembench/wiki/Raspberry-Pi-%28BCM2708%29
http://www.netlib.org/benchmark/linpackc
http://www.openssl.org/source/

Inga kommentarer:

Skicka en kommentar