Bendera CPU manakah yang cocok untuk gcc di Raspberry Pi?

23

gcc menggunakan flag -mcpu = (atau -march =) untuk menghasilkan kode yang dioptimalkan untuk jenis CPU tertentu. Ada banyak varian lengan, dan target Lengan gcc juga menyediakan berbagai jenis FPU.

-Mcpu = / - march = flags dan -mfpu = flag mana yang benar / asli yang digunakan ketika mengkompilasi kode C pada Raspberry Pi?

tidak
sumber

Jawaban:

11

Ini tergantung pada perpustakaan yang ingin Anda tautkan dengan kode Anda. Jika Anda menggunakan gambar Raspbian, arsitekturnya adalah "armhf" dan bendera kompilasi adalah:

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

Jika Anda mengompilasi untuk lengkungan Debian "armel", bendera kompilasi berbeda.

Nakedible
sumber
10

Inti RPI ARM adalah ARM 1176jzf-S, bendera yang sesuai seharusnya

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

Jatuhkan -mfloat-abi = hard -mfpu = vfp ketika di distro float lunak.

Bendera ini dapat ditemukan dengan menjalankan gcc -mcpu=native -march=native -Q --help=targetpada gcc> = 4.7`

tidak
sumber
Berlari gcc -mcpu=native -march=native -Q --help=targetmemberi saya *** Error in gcc ': bebas ganda atau korupsi (atas): 0x0020c5a8 *** `, di Raspbian Jessie 4.4.13-v7 +, armv7l.
tsbertalan
8

Saya menemukan bahwa set ini harus yang optimal:

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

(the -mfloat-abi = hard, tentu saja hanya ketika Anda menggunakan distro armhf)

ikku
sumber
3

Saya tidak bisa menjawab tentang -mfpuflag, tetapi saya sarankan untuk mencoba ini dulu:

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

Seperti yang dilaporkan dalam GCC manual page related to ARM options:

-march = asli menyebabkan kompiler mendeteksi secara otomatis arsitektur komputer build. Saat ini, fitur ini hanya didukung di Linux, dan tidak semua arsitektur dikenali. Jika deteksi otomatis tidak berhasil, opsi tidak akan berpengaruh.

-mcpu = asli menyebabkan kompiler mendeteksi CPU secara otomatis dari komputer yang dibuat. Saat ini, fitur ini hanya didukung di Linux, dan tidak semua arsitektur dikenali. Jika deteksi otomatis tidak berhasil, opsi tidak akan berpengaruh.

-mtune = asli menyebabkan kompiler untuk secara otomatis mendeteksi CPU dari komputer build. Saat ini, fitur ini hanya didukung di Linux, dan tidak semua arsitektur dikenali. Jika deteksi otomatis tidak berhasil, opsi tidak akan berpengaruh.

Anda kemudian dapat menambahkan -Q -vke Anda GCC flagsuntuk melihat optimasi apa yang diaktifkan dan melanjutkan ke optimasi lebih lanjut jika perlu.

Ini adalah output yang digunakan -march=nativedengan program sampel pada Raspberry Pi saya:

#> 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
sumber
1
-march = asli tidak diterapkan untuk prosesor ARM di gcc. (setidaknya bukan pengiriman gcc dengan Raspberrian)
no
@ nnos : seperti yang dapat Anda baca dalam jawaban saya, halaman ini mengatakan bahwa -march=nativeini diterapkan untuk ARM GCC. Raspberry Pi mungkin merupakan arsitektur yang tidak didukung (dan karenanya tidak terdeteksi), dalam hal -march=nativeini tidak berpengaruh.
Avio
2
gcc pada Raspberrian saya mengatakan:, $ gcc -march=native test.c cc1: error: bad value (native) for -march switchia mengatakan hal yang sama dalam output Anda. (sama dengan -mcpu juga)
no
1
Versi yang sama seperti saya. Lihat di output yang Anda posting, itu tersembunyi di semua verboseness dengan flag -v. Setelah baris yang mengatakan COLLECT_GCC_OPTIONS ...
nos
1
@nos : ok, sepertinya tidak didukung dalam versi ini. Yang aneh adalah bahwa saya tidak dapat menemukan changelog di mana -march=nativetelah diperkenalkan juga ARM.
Avio