Những cờ CPU nào phù hợp với gcc trên Raspberry Pi?


23

gcc lấy các cờ -mcpu = (hoặc -march =) để tạo mã được tối ưu hóa cho một loại CPU cụ thể. Có rất nhiều biến thể của cánh tay và mục tiêu Arm gcc cũng cung cấp nhiều loại FPU.

Mà -mcpu = / - march = flags và -mfpu = flags là những cái thích hợp / nguyên gốc để sử dụng khi biên dịch mã C trên Raspberry Pi?

Câu trả lời:


11

Điều này phụ thuộc vào thư viện bạn muốn liên kết mã của mình với. Nếu bạn đang sử dụng hình ảnh Raspbian, kiến ​​trúc là "armhf" và các cờ tổng hợp là:

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

Nếu bạn đang biên dịch cho vòm "armel" của Debian, các cờ biên dịch sẽ khác.


10

Lõi ARM RPI là ARM 1176jzf-S, các cờ phù hợp nên là

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

Thả -mfloat-abi = hard -mfpu = vfp khi trên một bản phân phối phao mềm.

Những cờ này có thể được tìm thấy bằng cách chạy gcc -mcpu=native -march=native -Q --help=targettrên gcc> = 4.7`


Chạy gcc -mcpu=native -march=native -Q --help=targetcho tôi *** Error in gcc ': miễn phí gấp đôi hoặc tham nhũng (trên cùng): 0x0020c5a8 *** `, trên Raspbian Jessie 4.4.13-v7 +, armv7l.
tsbertalan

8

Tôi thấy rằng bộ này nên là tối ưu:

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

(-mfloat-abi = hard, tất nhiên chỉ khi bạn sử dụng bản phân phối armhf)


3

Tôi không thể trả lời về -mfpucờ, nhưng tôi khuyên bạn nên thử những điều này trước:

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

Như đã báo cáo trong GCC manual page related to ARM options:

-march = tự nhiên khiến trình biên dịch tự động phát hiện kiến ​​trúc của máy tính xây dựng. Hiện tại, tính năng này chỉ được hỗ trợ trên Linux và không phải tất cả các kiến ​​trúc đều được công nhận. Nếu tự động phát hiện không thành công, tùy chọn không có hiệu lực.

-mcpu = tự nhiên khiến trình biên dịch tự động phát hiện CPU của máy tính xây dựng. Hiện tại, tính năng này chỉ được hỗ trợ trên Linux và không phải tất cả các kiến ​​trúc đều được công nhận. Nếu tự động phát hiện không thành công, tùy chọn không có hiệu lực.

-mtune = tự nhiên khiến trình biên dịch tự động phát hiện CPU của máy tính xây dựng. Hiện tại, tính năng này chỉ được hỗ trợ trên Linux và không phải tất cả các kiến ​​trúc đều được công nhận. Nếu tự động phát hiện không thành công, tùy chọn không có hiệu lực.

Sau đó, bạn có thể thêm -Q -vvào GCC flagsđể xem những gì tối ưu hóa được kích hoạt và tiến hành tối ưu hóa thêm nếu cần thiết.

Đây là đầu ra sử dụng -march=nativevới một chương trình mẫu trên Raspberry Pi của tôi:

#> 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 = bản địa không được triển khai cho bộ xử lý ARM trong gcc. (ít nhất là không vận chuyển gcc với Raspberrian)
nos

@nos : như bạn có thể đọc trong câu trả lời của tôi, trang này nói rằng nó -march=nativeđược thực hiện cho ARM GCC. Raspberry Pi có thể là một kiến ​​trúc không được hỗ trợ (và do đó không bị phát hiện), trong trường hợp -march=nativeđó không có hiệu lực.
Avio

2
gcc trên Raspberrian của tôi nói : $ gcc -march=native test.c cc1: error: bad value (native) for -march switch, nó nói tương tự trong đầu ra của bạn. (cũng với -mcpu)
nos

1
Cùng một phiên bản với tôi. Hãy nhìn vào kết quả đầu ra mà bạn đã đăng, nó ẩn trong tất cả sự dài dòng với cờ -v. Sau dòng chữ COLLECT_GCC_OPTIONS ...
số

1
@nos : ok, có vẻ như không được hỗ trợ trong phiên bản này. Điều kỳ lạ là tôi không thể tìm thấy thay đổi nơi -march=nativeđã được giới thiệu cũng cho ARM.
Avio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.