Ada berapa tingkat pengoptimalan GCC ?
Saya mencoba gcc -O1, gcc -O2, gcc -O3, dan gcc -O4
Jika saya menggunakan jumlah yang sangat besar, itu tidak akan berhasil.
Namun, saya sudah mencoba
gcc -O100
dan itu dikompilasi.
Ada berapa tingkat pengoptimalan?
c
optimization
gcc
compiler-construction
neuromancer
sumber
sumber
man gcc
di Cygwin (12000 baris ganjil) Anda dapat mencari-O
dan menemukan semua jawaban di bawah status, dan kemudian beberapa.3
itu sama dengan3
(selama tidakint
meluap). Lihat jawaban saya .-fomit-stack-pointer
akan mengubah kode yang dihasilkan.Jawaban:
Untuk menjadi pedantic, ada 8 opsi -O valid berbeda yang dapat Anda berikan ke gcc, meskipun ada beberapa yang memiliki arti yang sama.
Versi asli jawaban ini menyatakan ada 7 pilihan. GCC sejak itu ditambahkan
-Og
sehingga totalnya menjadi 8Dari halaman manual:
-O
(Sama seperti-O1
)-O0
(tidak melakukan optimasi, default jika tidak ada level optimasi yang ditentukan)-O1
(optimalkan minimal)-O2
(optimalkan lebih banyak)-O3
(optimalkan lebih banyak lagi)-Ofast
(optimalkan dengan sangat agresif hingga melanggar kepatuhan standar)-Og
(Optimalkan pengalaman debugging. -Og memungkinkan pengoptimalan yang tidak mengganggu debugging. Ini harus menjadi tingkat pengoptimalan pilihan untuk siklus edit-kompilasi-debug standar, yang menawarkan tingkat pengoptimalan yang wajar sambil mempertahankan kompilasi cepat dan pengalaman debugging yang baik. )-Os
(. Optimalkan untuk ukuran-Os
memungkinkan semua-O2
optimasi yang tidak biasanya meningkatkan ukuran kode Hal ini juga melakukan optimasi lebih lanjut yang dirancang untuk mengurangi ukuran kode..-Os
Menonaktifkan flag optimasi berikut:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays -ftree-vect-loop-version
)Mungkin juga ada pengoptimalan khusus platform, seperti yang dicatat @pauldoo, OS X memiliki
-Oz
sumber
-Oz
setelan tambahan yang "optimalkan ukuran lebih agresif daripada-Os
": developer.apple.com/mac/library/DOCUMENTATION/DeveloperTools/…-Og
, yaitu semua opsi pengoptimalan yang tidak mengganggu debuggingMari kita tafsirkan kode sumber GCC 5.1 untuk melihat apa yang terjadi
-O100
karena tidak jelas pada halaman manual.Kami akan menyimpulkan bahwa:
-O3
atasINT_MAX
sama dengan-O3
, tetapi itu dapat dengan mudah berubah di masa depan, jadi jangan mengandalkannya.INT_MAX
.-O-1
Fokus pada subprogram
Pertama ingat bahwa GCC hanya sebuah front-end untuk
cpp
,as
,cc1
,collect2
. A quick./XXX --help
mengatakan itu sajacollect2
dancc1
mengambil-O
, jadi mari kita fokus pada mereka.Dan:
memberikan:
jadi
-O
diteruskan ke keduanyacc1
dancollect2
.O yang sama. Opt
common.opt adalah format deskripsi opsi CLI khusus GCC yang dijelaskan dalam dokumentasi internal dan diterjemahkan ke C oleh opth-gen.awk dan optc-gen.awk .
Ini berisi baris menarik berikut:
yang menentukan semua
O
opsi. Perhatikan bagaimana-O<n>
berada dalam satu keluarga terpisah dari yang lainOs
,Ofast
danOg
.Saat kami membangun, ini menghasilkan
options.h
file yang berisi:Sebagai bonus, saat kita menggapai
\bO\n
bagian dalamcommon.opt
kita memperhatikan garis:yang mengajarkan kita bahwa
--optimize
(tanda hubung ganda karena dimulai dengan tanda hubung-optimize
pada.opt
file) adalah alias tidak berdokumen-O
yang dapat digunakan sebagai--optimize=3
!Dimana OPT_O digunakan
Sekarang kita grep:
yang mengarahkan kita ke dua file:
Mari kita telusuri dulu
opts.c
opts.c: default_options_optimization
Semua
opts.c
penggunaan terjadi di dalam:default_options_optimization
.Kami grep mundur untuk melihat siapa yang memanggil fungsi ini, dan kami melihat bahwa satu-satunya jalur kode adalah:
main.c:main
toplev.c:toplev::main
opts-global.c:decode_opts
opts.c:default_options_optimization
dan
main.c
merupakan titik masuk daricc1
. Baik!Bagian pertama dari fungsi ini:
integral_argument
yang memanggilatoi
string yang sesuaiOPT_O
untuk mengurai argumen inputopts->x_optimize
manaopts
astruct gcc_opts
.struct gcc_opts
Setelah melakukan grep dengan sia-sia, kami melihat bahwa ini
struct
juga dihasilkan dioptions.h
:dari mana
x_optimize
berasal dari garis:hadir di
common.opt
, dan bahwaoptions.c
:jadi kami menebak bahwa inilah yang berisi seluruh konfigurasi status global, dan
int x_optimize
merupakan nilai pengoptimalan.255 adalah maksimum internal
in
opts.c:integral_argument
,atoi
diterapkan ke argumen input, begituINT_MAX
juga batas atasnya. Dan jika Anda meletakkan sesuatu yang lebih besar, tampaknya GCC menjalankan perilaku C tidak terdefinisi. Aduh?integral_argument
juga dengan tipis membungkusatoi
dan menolak argumen jika ada karakter yang bukan digit. Jadi nilai-nilai negatif gagal dengan baik.Kembali ke
opts.c:default_options_optimization
, kita melihat baris:sehingga tingkat pengoptimalan dipotong menjadi
255
. Saat membacaopth-gen.awk
saya menemukan:dan di hasilkan
options.h
:yang menjelaskan mengapa pemotongan: opsi juga harus diteruskan
cl_optimization
, yang menggunakan achar
untuk menghemat ruang. Jadi 255 sebenarnya adalah maksimum internal.opts.c: maybe_default_options
Kembali ke
opts.c:default_options_optimization
, kami menemukanmaybe_default_options
yang terdengar menarik. Kami memasukinya, dan kemudian dimaybe_default_option
mana kami mencapai sakelar besar:Tidak ada
>= 4
pemeriksaan, yang menunjukkan bahwa3
kemungkinan terbesar.Lalu kita cari definisi
OPT_LEVELS_3_PLUS
incommon-target.h
:Ha! Ini adalah indikator kuat bahwa hanya ada 3 level.
opts.c: default_options_table
opt_levels
sangat menarik, sehingga kami grepOPT_LEVELS_3_PLUS
, dan menemukanopts.c:default_options_table
:jadi di sinilah
-On
pemetaan pengoptimalan khusus yang disebutkan dalam dokumen dikodekan. Bagus!Pastikan tidak ada lagi kegunaan x_optimize
Penggunaan utama dari
x_optimize
adalah untuk mengatur opsi pengoptimalan spesifik lainnya seperti yang-fdefer_pop
didokumentasikan di halaman manual. Apakah masih ada lagiKami
grep
, dan temukan beberapa lagi. Jumlahnya kecil, dan setelah pemeriksaan manual kami melihat bahwa setiap penggunaan hanya melakukan paling banyak ax_optimize >= 3
, jadi kesimpulan kami berlaku.lto-wrapper.c
Sekarang kita pergi ke kejadian kedua
OPT_O
, yaitu masuklto-wrapper.c
.LTO berarti Pengoptimalan Waktu Tautan, yang seperti namanya akan membutuhkan
-O
opsi, dan akan ditautkancollec2
(yang pada dasarnya adalah penaut).Faktanya, baris pertama
lto-wrapper.c
mengatakan:Dalam file ini,
OPT_O
kejadian tampaknya hanya menormalkan nilaiO
untuk meneruskannya, jadi kita akan baik-baik saja.sumber
Tujuh level berbeda:
-O0
(default): Tidak ada pengoptimalan.-O
atau-O1
(hal yang sama): Optimalkan, tetapi jangan menghabiskan terlalu banyak waktu.-O2
: Mengoptimalkan dengan lebih agresif-O3
: Mengoptimalkan paling agresif-Ofast
: Setara dengan-O3 -ffast-math
.-ffast-math
memicu pengoptimalan floating point yang tidak sesuai standar. Hal ini memungkinkan penyusun untuk berpura-pura bahwa bilangan floating point tepat tak terbatas, dan aljabar pada mereka mengikuti aturan standar aljabar bilangan real. Ini juga memberi tahu kompiler untuk memberi tahu perangkat keras untuk menghapus denormals ke nol dan memperlakukan denormals sebagai nol, setidaknya pada beberapa prosesor, termasuk x86 dan x86-64. Denormals memicu jalur lambat pada banyak FPU, sehingga memperlakukannya sebagai nol (yang tidak memicu jalur lambat) bisa menjadi kemenangan kinerja yang besar.-Os
: Mengoptimalkan ukuran kode. Ini sebenarnya dapat meningkatkan kecepatan dalam beberapa kasus, karena perilaku I-cache yang lebih baik.-Og
: Mengoptimalkan, tetapi tidak mengganggu proses debug. Hal ini memungkinkan performa yang tidak memalukan untuk build debug dan dimaksudkan untuk menggantikan-O0
build debug.Ada juga opsi lain yang tidak diaktifkan oleh salah satu dari ini, dan harus diaktifkan secara terpisah. Dimungkinkan juga untuk menggunakan opsi pengoptimalan, tetapi nonaktifkan tanda tertentu yang diaktifkan oleh pengoptimalan ini.
Untuk informasi lebih lanjut, lihat situs web GCC.
sumber
-O100
mengkompilasi?Empat (0-3): Lihat panduan GCC 4.4.2 . Apa pun yang lebih tinggi hanya -O3, tetapi pada titik tertentu Anda akan melebihi batas ukuran variabel.
sumber
atoi
perilaku yang tidak ditentukan, diikuti oleh255
batas internal.