Raspberry Pi'deki gcc için hangi CPU bayrakları uygundur?


23

gcc, belirli bir CPU tipi için optimize edilmiş kod üretmek üzere -mcpu = (veya -march =) bayraklarını alır. Çok sayıda kol varyantı var ve gcc Arm hedefi de çeşitli FPU tipleri sağlıyor.

Hangi -mcpu = / - march = bayraklar ve -mfpu = bayraklar bir Ahududu Pi'ye C kodu derlerken kullanılacak doğru / yerel olanlar hangileridir?

Yanıtlar:


11

Bu, kodunuzu bağlamak istediğiniz hangi kitaplıklara bağlıdır. Raspbian görüntüleri kullanıyorsanız, mimari "armhf" ve derleme bayrakları:

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

Debian "armel" arch için derliyorsanız, derleme bayrakları farklıdır.


10

RPI ARM çekirdeği bir ARM 1176jzf-S'dir, uygun bayraklar daha sonra

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

-Mfloat-abi = hard -mfpu = vfp'yi yumuşak bir float dağıtımında bırak.

Bu bayraklar, gcc -mcpu=native -march=native -Q --help=targetgcc> = 4.7` konumunda çalıştırılarak bulunabilir.


Koşmak gcc -mcpu=native -march=native -Q --help=targetbana *** Error in gcc ' verir : iki kat serbest veya yozlaşmış (üstte): 0x0020c5a8 *** `, Raspbian Jessie 4.4.13-v7 +, armv7l.
tsbertalan

8

Bu setin optimal olması gerektiğini buldum:

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

(-mfloat-abi = zor, tabii ki sadece bir armf dağıtımı kullandığınızda)


3

-mfpuBayrak hakkında cevap veremem , ancak önce bunları denemenizi öneririm:

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

Bildirildiği gibi GCC manual page related to ARM options:

-march = native , derleyicinin derleme bilgisayarının yapısını otomatik olarak algılamasına neden olur. Şu anda, bu özellik yalnızca Linux'ta desteklenmektedir ve tüm mimariler tanınmamaktadır. Otomatik algılama başarısız olursa, seçeneğin bir etkisi olmaz.

-mcpu = native , derleyicinin derleme bilgisayarının CPU'sunu otomatik olarak algılamasına neden olur. Şu anda, bu özellik yalnızca Linux'ta desteklenmektedir ve tüm mimariler tanınmamaktadır. Otomatik algılama başarısız olursa, seçeneğin bir etkisi olmaz.

-mtune = native , derleyicinin derleme bilgisayarının CPU'sunu otomatik olarak algılamasına neden olur. Şu anda, bu özellik yalnızca Linux'ta desteklenmektedir ve tüm mimariler tanınmamaktadır. Otomatik algılama başarısız olursa, seçeneğin bir etkisi olmaz.

Daha sonra hangi optimizasyonların etkin olduğunu görmek -Q -viçin ekleyebilir GCC flagsve gerekirse daha fazla optimizasyona geçebilirsin .

-march=nativeRaspberry Pi'mde örnek bir program kullanan çıktı :

#> 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

1
-march = native, gcc'deki ARM işlemcileri için uygulanmadı. (en azından Raspberrian ile nakliye gcc değil)
nos

@ Not : Cevabımı okuyabileceğiniz gibi, bu sayfa bunun için -march=nativede yazıldığını söylüyor ARM GCC. Ahududu Pi desteklenmeyen (ve dolayısıyla algılanamayan) bir mimari olabilir, bu durumda bir -march=nativeetkisi olmaz.
Avio

2
Raspberrian'ımdaki gcc diyor ki: $ gcc -march=native test.c cc1: error: bad value (native) for -march switchçıktılarınızda da aynı diyor. (aynı zamanda -mcpu ile birlikte)
nos

1
Benimle aynı sürüm. Gönderdiğiniz çıktıya bakın, -v bayrağıyla birlikte tüm ayrıntılarıyla gizlenir. COLLECT_GCC_OPTIONS ... diyen satırdan sonra ...
nos

1
@ @ nos : tamam, bu sürümde desteklenmiyor gibi görünüyor. Garip olan şey, bunun -march=nativeiçin de tanıtılan değişmezliği bulamamam ARM.
Avio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.