Quels drapeaux CPU conviennent à gcc sur Raspberry Pi?

23

gcc utilise les indicateurs -mcpu = (ou -march =) pour produire du code optimisé pour un type de processeur particulier. Il existe une pléthore de variantes de bras, et la cible gcc Arm fournit également de nombreux types de FPU.

Quels indicateurs -mcpu = / - march = et -mfpu = sont les indicateurs natifs / appropriés à utiliser lors de la compilation de code C sur un Raspberry Pi?

non
la source

Réponses:

11

Cela dépend des bibliothèques avec lesquelles vous souhaitez lier votre code. Si vous utilisez les images Raspbian, l'architecture est "armhf" et les drapeaux de compilation sont:

-march=armv6
-mfpu=vfp
-mfloat-abi=hard

Si vous compilez pour Debian "armel" arch, les drapeaux de compilation sont différents.

Nakedible
la source
10

Le cœur RPI ARM est un ARM 1176jzf-S, les drapeaux appropriés doivent alors être

-march=armv6zk -mcpu=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp

Supprimez -mfloat-abi = hard -mfpu = vfp lorsque vous êtes sur une distribution soft float.

Ces drapeaux peuvent être trouvés en exécutant gcc -mcpu=native -march=native -Q --help=targetsur gcc> = 4.7`

non
la source
L'exécution gcc -mcpu=native -march=native -Q --help=targetme donne *** Error in gcc ': double libre ou corruption (en haut): 0x0020c5a8 *** `, sur Raspbian Jessie 4.4.13-v7 +, armv7l.
tsbertalan
8

J'ai trouvé que cet ensemble devrait être optimal:

-march=armv6 -mfloat-abi=hard -mfpu=vfp

(-mfloat-abi = hard, bien sûr uniquement lorsque vous utilisez une distribution armhf)

ikku
la source
3

Je ne peux pas répondre au sujet du -mfpudrapeau, mais je suggère d'essayer ces derniers d'abord:

-march=native
-mcpu=native
-mtune=native

Comme indiqué dans GCC manual page related to ARM options:

-march = native oblige le compilateur à détecter automatiquement l'architecture de l'ordinateur de génération. À l'heure actuelle, cette fonctionnalité n'est prise en charge que sous Linux et toutes les architectures ne sont pas reconnues. Si la détection automatique échoue, l'option n'a aucun effet.

-mcpu = native fait que le compilateur détecte automatiquement le CPU de l'ordinateur de build. À l'heure actuelle, cette fonctionnalité n'est prise en charge que sous Linux et toutes les architectures ne sont pas reconnues. Si la détection automatique échoue, l'option n'a aucun effet.

-mtune = native oblige le compilateur à détecter automatiquement le processeur de l'ordinateur de génération. À l'heure actuelle, cette fonctionnalité n'est prise en charge que sous Linux et toutes les architectures ne sont pas reconnues. Si la détection automatique échoue, l'option n'a aucun effet.

Vous pouvez ensuite ajouter -Q -và votre GCC flagspour voir quelles optimisations sont activées et procéder à d'autres optimisations si nécessaire.

Voici la sortie à l'aide -march=natived'un exemple de programme sur mon Raspberry Pi:

#> gcc -march=native -Q -v test.c -o test
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-8+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-8+rpi1) 
COLLECT_GCC_OPTIONS='-march=native' '-Q' '-v' '-o' 'test' '-mfloat-abi=hard' '-mfpu=vfp'
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/cc1 -v -imultilib . -imultiarch arm-linux-gnueabihf test.c -dumpbase test.c -march=native -mfloat-abi=hard -mfpu=vfp -auxbase test -version -o /tmp/cc1rCJ4W.s
cc1: error: bad value (native) for -march switch
GNU C (Debian 4.6.3-8+rpi1) version 4.6.3 (arm-linux-gnueabihf)
    compiled by GNU C version 4.6.3, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9
GGC heuristics: --param ggc-min-expand=38 --param ggc-min-heapsize=15522
ignoring nonexistent directory "/usr/local/include/arm-linux-gnueabihf"
ignoring nonexistent directory "/usr/lib/gcc/arm-linux-gnueabihf/4.6/../../../../arm-linux-gnueabihf/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/include
 /usr/local/include
 /usr/lib/gcc/arm-linux-gnueabihf/4.6/include-fixed
 /usr/include/arm-linux-gnueabihf
 /usr/include
End of search list.
GNU C (Debian 4.6.3-8+rpi1) version 4.6.3 (arm-linux-gnueabihf)
    compiled by GNU C version 4.6.3, GMP version 5.0.5, MPFR version 3.1.0-p10, MPC version 0.9
GGC heuristics: --param ggc-min-expand=38 --param ggc-min-heapsize=15522
options passed:  -v -imultilib . -imultiarch arm-linux-gnueabihf test.c
 -march=native -mfloat-abi=hard -mfpu=vfp
options enabled:  -fauto-inc-dec -fbranch-count-reg -fcommon
 -fdelete-null-pointer-checks -fdwarf2-cfi-asm -fearly-inlining
 -feliminate-unused-debug-types -ffunction-cse -fgcse-lm -fident
 -finline-functions-called-once -fira-share-save-slots
 -fira-share-spill-slots -fivopts -fkeep-static-consts -fleading-underscore
 -fmath-errno -fmerge-debug-strings -fmove-loop-invariants -fpeephole
 -fprefetch-loop-arrays -freg-struct-return -fsched-critical-path-heuristic
 -fsched-dep-count-heuristic -fsched-group-heuristic -fsched-interblock
 -fsched-last-insn-heuristic -fsched-rank-heuristic -fsched-spec
 -fsched-spec-insn-heuristic -fsched-stalled-insns-dep -fshow-column
 -fsigned-zeros -fsplit-ivs-in-unroller -fstrict-volatile-bitfields
 -ftrapping-math -ftree-cselim -ftree-forwprop -ftree-loop-if-convert
 -ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize
 -ftree-parallelize-loops= -ftree-phiprop -ftree-pta -ftree-reassoc
 -ftree-scev-cprop -ftree-slp-vectorize -ftree-vect-loop-version
 -funit-at-a-time -fvar-tracking -fvar-tracking-assignments
 -fzero-initialized-in-bss -mglibc -mlittle-endian -msched-prolog

Execution times (seconds)
 TOTAL                 :   0.00             0.00             0.00                  8 kB
Avio
la source
1
-march = native n'est pas implémentée pour les processeurs ARM dans gcc. (au moins pas d'expédition gcc avec Raspberrian)
nos
@nos : comme vous pouvez le lire dans ma réponse, cette page indique que -march=nativec'est implémenté pour ARM GCC. Le Raspberry Pi peut être une architecture non prise en charge (et donc non détectée), dans ce cas, -march=nativen'a aucun effet.
Avio
2
gcc sur mon Raspberrian dit:, $ gcc -march=native test.c cc1: error: bad value (native) for -march switchil en dit de même dans votre sortie. (idem avec -mcpu également)
nos
1
Même version que moi. Regardez dans la sortie que vous avez publiée, elle est cachée dans toute la verbosité avec le drapeau -v. Après la ligne disant COLLECT_GCC_OPTIONS ...
nos
1
@nos : ok, il ne semble pas pris en charge dans cette version. Ce qui est étrange, c'est que je ne trouve pas le journal des modifications où -march=nativea également été introduit pour ARM.
Avio