แฟล็ก CPU ใดที่เหมาะสำหรับ gcc ใน Raspberry Pi


23

gcc รับแฟล็ก -mcpu = (หรือ -march =) เพื่อสร้างรหัสที่เหมาะสำหรับประเภท CPU เฉพาะ มีหลากหลายแขนมากมายและเป้าหมาย gcc Arm ยังมี FPU หลายประเภท

-mcpu = / - march = flags และ -mfpu = flag ใดที่เหมาะสม / native ที่จะใช้เมื่อรวบรวมรหัส C บน Raspberry Pi?

คำตอบ:


11

ขึ้นอยู่กับไลบรารีที่คุณต้องการเชื่อมโยงรหัสของคุณ หากคุณใช้อิมเมจ Raspbian สถาปัตยกรรมคือ "armhf" และแฟล็กการรวบรวมคือ:

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

หากคุณกำลังรวบรวมสำหรับ arch "armel" Debian สถานะการรวบรวมจะแตกต่างกัน


10

แกน RPI ARM คือ ARM 1176jzf-S ธงที่เหมาะสมควรเป็น

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

วาง -mfloat-abi = hard -mfpu = vfp เมื่ออยู่ใน distro soft

สามารถพบการตั้งค่าสถานะเหล่านี้โดยเรียกใช้gcc -mcpu=native -march=native -Q --help=targetบน gcc> = 4.7`


วิ่งgcc -mcpu=native -march=native -Q --help=targetให้ฉัน*** Error in gcc ': สองครั้งฟรีหรือเสียหาย (ด้านบน): 0x0020c5a8 *** `บน Raspbian Jessie 4.4.13-v7 +, armv7l
tsbertalan

8

ฉันพบว่าชุดนี้ควรเหมาะสมที่สุด:

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

(-mfloat-abi = hard แน่นอนเมื่อคุณใช้ armhf distro)


3

ฉันไม่สามารถตอบเกี่ยวกับการ-mfpuตั้งค่าสถานะ แต่ฉันขอแนะนำให้ลองเหล่านี้ก่อน:

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

ตามที่รายงานในGCC manual page related to ARM options:

-march = เนทีฟทำให้คอมไพเลอร์ตรวจจับสถาปัตยกรรมของคอมพิวเตอร์สร้างโดยอัตโนมัติ ในปัจจุบันคุณสมบัตินี้รองรับเฉพาะ 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 = เนทีฟไม่ได้ใช้งานสำหรับโปรเซสเซอร์ ARM ใน gcc (อย่างน้อยไม่ gcc จัดส่งด้วย Raspberrian)
เลขที่

@nos : ในขณะที่คุณสามารถอ่านในคำตอบของฉันหน้านี้บอกว่าจะดำเนินการสำหรับ-march=native ARM GCCRaspberry Pi อาจเป็นสถาปัตยกรรมที่ไม่ได้รับการสนับสนุน (และตรวจไม่ถูกตรวจ) ในกรณี-march=nativeนั้นจะไม่มีผลกระทบใด ๆ
Avio

2
gcc บน Raspberrian ของฉันพูดว่า: $ gcc -march=native test.c cc1: error: bad value (native) for -march switchมันบอกว่าเหมือนกันในผลลัพธ์ของคุณ (เช่นเดียวกันกับ -mcpu เช่นกัน)
nos

1
รุ่นเดียวกับฉัน ดูในเอาต์พุตที่คุณโพสต์ซึ่งจะซ่อนอยู่ในความละเอียดทั้งหมดด้วยแฟล็ก -v หลังจากที่สายบอก COLLECT_GCC_OPTIONS ...
Nos

1
@ ไม่มี : ดูเหมือนว่ารุ่นนี้ไม่ได้รับการสนับสนุน สิ่งที่แปลกคือว่าผมไม่สามารถหาการเปลี่ยนแปลงที่ได้รับการแนะนำยัง-march=native ARM
Avio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.