Raspberry Pi에서 gcc에 적합한 CPU 플래그는 무엇입니까?


23

gcc는 -mcpu = (또는 -march =) 플래그를 사용하여 특정 CPU 유형에 최적화 된 코드를 생성합니다. 수많은 arm 변형이 있으며 gcc Arm 대상은 수많은 FPU 유형도 제공합니다.

Raspberry Pi에서 C 코드를 컴파일 할 때 어떤 -mcpu = /-march = 플래그와 -mfpu = 플래그가 적절한 / 네이티브 플래그입니까?

답변:


11

이것은 코드를 연결하려는 라이브러리에 따라 다릅니다. Raspbian 이미지를 사용하는 경우 아키텍처는 "armhf"이고 컴파일 플래그는 다음과 같습니다.

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

데비안 "armel"아치를 컴파일하는 경우 컴파일 플래그가 다릅니다.


10

RPI ARM 코어는 ARM 1176jzf-S이므로 적절한 플래그는

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

소프트 플로트 디스플레이에서 -mfloat-abi = hard -mfpu = vfp를 삭제하십시오.

이 플래그는 gcc -mcpu=native -march=native -Q --help=targetgcc> = 4.7`에서 실행하면 찾을 수 있습니다.


실행 gcc -mcpu=native -march=native -Q --help=target하면 *** Error in gcc ': double free 또는 손상 (상단) : 0x0020c5a8 ***`, Raspbian Jessie 4.4.13-v7 +, armv7l이 제공됩니다.
tsbertalan

8

이 세트가 최적이어야한다는 것을 알았습니다.

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

(물론 armf 배포판을 사용할 때만 -mfloat-abi = hard)


3

나는 -mfpu플래그에 대해 대답 할 수 없지만 먼저 다음을 시도하는 것이 좋습니다.

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

에보 고 GCC manual page related to ARM options:

-march = native 는 컴파일러가 빌드 컴퓨터의 아키텍처를 자동 감지하도록합니다. 현재이 기능은 Linux에서만 지원되며 모든 아키텍처가 인식되는 것은 아닙니다. 자동 감지에 실패하면 옵션이 적용되지 않습니다.

-mcpu = native 는 컴파일러가 빌드 컴퓨터의 CPU를 자동 감지하도록합니다. 현재이 기능은 Linux에서만 지원되며 모든 아키텍처가 인식되는 것은 아닙니다. 자동 감지에 실패하면 옵션이 적용되지 않습니다.

-mtune = native 는 컴파일러가 빌드 컴퓨터의 CPU를 자동 감지하도록합니다. 현재이 기능은 Linux에서만 지원되며 모든 아키텍처가 인식되는 것은 아닙니다. 자동 감지에 실패하면 옵션이 적용되지 않습니다.

그런 다음에 추가 -Q -v하여 GCC flags활성화 된 최적화를 확인하고 필요한 경우 추가 최적화를 진행할 수 있습니다.

이것은 -march=native내 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

1
-march = native는 gcc의 ARM 프로세서에 대해 구현되지 않습니다. (적어도 Raccberrian과 함께 gcc 배송 불가)
nos

@nos : 내 대답에서 읽을 수 있듯이이 페이지-march=native에 구현되어 있다고 말합니다 ARM GCC. Raspberry Pi는 지원되지 않는 (따라서 감지되지 않은) 아키텍처 일 수 있으며,이 경우 -march=native효과가 없습니다.
Avio

2
내 Raspberrian의 gcc는 다음 $ gcc -march=native test.c cc1: error: bad value (native) for -march switch과 같이 말합니다. (-mcpu와 동일)
nos

1
나와 같은 버전입니다. 게시 한 출력을 살펴보면 -v 플래그와 함께 모든 정보가 숨겨져 있습니다. COLLECT_GCC_OPTIONS라고 말하는 줄 이후 ...
nos

1
@nos : 좋아,이 버전에서는 지원되지 않는 것 같습니다. 이상한 점은에 -march=native대해 소개 된 변경 로그를 찾을 수 없다는 것 입니다 ARM.
Avio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.