Kompilasi GNU / Linux dengan optimasi -O3

18

Dikatakan bahwa mengkompilasi alat GNU dan kernel Linux dengan -O3opsi optimasi gcc akan menghasilkan bug yang aneh dan funky. Apakah itu benar Adakah yang mencobanya atau hanya tipuan?

uray
sumber
Menariknya -O0juga tidak didukung sama sekali! stackoverflow.com/questions/29151235/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

8

Ini digunakan di Gentoo, dan saya tidak melihat ada yang aneh.

izaac
sumber
8
Namun harap dicatat bahwa -O3 sering disaring oleh ebuild.
Maciej Piechotka
17

-O3 memiliki beberapa kelemahan:

  1. Pertama-tama sering menghasilkan kode lebih lambat daripada -O2atau -Os. Kadang-kadang menghasilkan kode lebih lama karena loop membuka gulungan yang mungkin sebenarnya lebih lambat karena kinerja kode cache yang lebih buruk.
  2. Seperti yang dikatakan terkadang menghasilkan kode yang salah. Mungkin karena kesalahan dalam optimasi atau kesalahan dalam kode (seperti mengabaikan alias ketat). Karena kode kernel kadang-kadang dan terkadang harus 'pintar', saya akan mengatakan bahwa ada beberapa pengembang kernel yang melakukan kesalahan. Saya mengalami berbagai masalah aneh, seperti crash utilitas userspace, ketika saya mengkompilasi kernel dengan gcc 4.5 yang pada saat itu stabil. Saya masih menggunakan gcc 4.4 untuk kernel dan beberapa utilitas userspace yang dipilih karena berbagai bug. Hal yang sama berlaku untuk -O3.
  3. Saya tidak berpikir itu menawarkan banyak manfaat untuk kernel Linux. Kernel tidak melakukan perhitungan berat dan di tempat itu, ia dioptimalkan dengan perakitan. -O3flag tidak akan mengubah biaya pengalihan konteks atau kecepatan I / O. Saya tidak berpikir sesuatu seperti <0,1% percepatan kinerja keseluruhan tidak sia-sia.
Maciej Piechotka
sumber
6
Linux dikompilasi dengan -fno-strict-aliasing karena Linus berpikir gcc menjadi bodoh dan terlalu membatasi karena ia melakukan hal-hal bodoh seperti memperlakukan nilai sebagai berbeda walaupun mereka jelas tidak jelas (yaitu aliasing diperkenalkan di dalam satu fungsi dan kompiler dapat lihat itu). lihat mail-archive.com/[email protected]/msg01647.html
Spudd86
@ Spudd86: Apakah maksudnya mereka jelas bukan untuk manusia yang membaca kode atau untuk kompiler? Seperti yang saya katakan - Kernel terkadang perlu melakukan hal-hal cerdas yang tidak boleh dilakukan oleh program userspace. Apa yang masuk akal untuk userspace (optimasi berat di beberapa area) mungkin tidak masuk akal untuk kernel (jumlah kode pintar + bottleneck yang lebih besar di tempat yang berbeda).
Maciej Piechotka
1
Tidak, apa yang dia katakan juga berlaku untuk userspace.
Spudd86
1
@ Spudd86: Saya tidak setuju dengan itu. Membuat kompiler 'cukup pintar' untuk mengenali hal-hal 'jelas' seperti itu bukanlah hal sepele. Jadi satu-satunya cara yang mungkin adalah a) hanya menghasilkan kode lambat (er) (yang tidak dapat diterima untuk beberapa kasus penggunaan di, katakanlah, HPC) dan / atau memaksa programmer untuk secara manual mengoptimalkan kode b) membuat aturan lebih ketat untuk memungkinkan 'bodoh' compiler untuk melakukan optimalisasi - rute yang diambil oleh standar C.
Maciej Piechotka
6

Perhatikan bahwa potongan besar dari toolchain (khususnya glibc) flat out tidak dapat dikompilasi jika Anda mengubah level optimisasi. Sistem build diatur untuk mengabaikan preferensi -O Anda untuk bagian ini pada sebagian besar distro yang waras.

Sederhananya, pustaka fundamental dan fitur OS tertentu tergantung pada kode yang benar-benar melakukan apa yang dikatakannya, bukan apa yang akan lebih cepat dalam banyak kasus. -fgcse-after-reload secara khusus (diaktifkan oleh -O3) dapat menyebabkan masalah aneh.

pengguna455
sumber
5

Selama 10 tahun terakhir saya telah menjalankan banyak sistem Gentoo dengan 1000+ paket menggunakan -O3 -march=nativesecara global dan belum mengalami salah satu dari masalah stabilitas mistis yang -O3seharusnya ada. Benchmark aplikasi intensif CPU (seperti aplikasi matematika / sains) secara konsisten menunjukkan -O3untuk menghasilkan kode lebih cepat, setelah semua itu akan sia-sia jika tidak. Untuk sebagian besar aplikasi desktop CFLAGStidak terlalu penting karena mereka terikat IO, tetapi penting untuk hal-hal sisi server yang terikat CPU.

Mark Pariente
sumber
3

-O3 menggunakan beberapa optimisasi agresif yang hanya aman jika asumsi tertentu tentang penggunaan register, bagaimana stack frames berinteraksi dengan, dan fungsi reentrancy benar, dan asumsi ini tidak dijamin benar dalam beberapa kode seperti kernel terutama ketika inline assembly adalah digunakan (seperti di beberapa bagian kernel dan modul drivernya yang sangat rendah).

David Spillett
sumber
Belum lagi itu tidak selalu lebih cepat, Anda harus benar-benar datang dengan tolok ukur dan mengujinya vs -O2untuk mengetahui cuaca atau tidak itu sakit atau membantu
Spudd86
0

Meskipun Anda dapat menggunakan -O3 dan kenop optimisasi lainnya pada sebagian besar aplikasi (dan itu dapat menghasilkan peningkatan kecepatan), saya akan ragu untuk menggunakan tweak kernel itu sendiri atau pada rantai alat yang diperlukan untuk membangunnya (kompiler, binutils, dll.)

Pikirkan tentang hal ini: Apakah keuntungan kinerja 5% dari subsistem raid dan ext3 bernilai crash sistem atau potensi kehilangan data dan / atau korupsi?

Tweak semua tombol yang Anda inginkan untuk port Quake yang Anda mainkan atau audio / video codec yang Anda gunakan untuk menyalin koleksi DVD Anda ke file divx. Anda mungkin akan melihat peningkatan. Hanya saja, jangan main-main dengan kernel kecuali Anda punya waktu untuk membuang dan data Anda dapat menanggung kehilangan.

Geoff Fritz
sumber
3
Saya tidak bertanya apakah itu layak atau tidak, aman atau tidak, atau mengapa kita tidak melakukan ini, apa yang saya tanyakan adalah fakta, apakah itu benar-benar menghasilkan bug dalam aplikasi nyata ?, apakah pernah terjadi ?, apakah terbukti demikian ..
uray