Biên dịch GNU / Linux với tối ưu hóa -O3


18

Người ta nói rằng biên dịch các công cụ GNU và nhân Linux với -O3tùy chọn tối ưu hóa gcc sẽ tạo ra các lỗi kỳ lạ và thú vị. Có thật không? Có ai đã thử nó hay nó chỉ là một trò lừa bịp?


Cũng thú vị -O0là không được hỗ trợ ở tất cả! stackoverflow.com/questions/29151235/ từ
Ciro Santilli 心 心 事件

Câu trả lời:


8

Nó được sử dụng trong Gentoo và tôi không nhận thấy điều gì bất thường.


8
Tuy nhiên, xin lưu ý rằng -O3 thường được lọc bởi các ebuild.
Maciej Piechotka

17

-O3 có một số nhược điểm:

  1. Trước hết, nó thường tạo mã chậm hơn -O2hoặc -Os. Đôi khi, nó tạo ra mã dài hơn do không kiểm soát được vòng lặp, điều này có thể thực tế chậm hơn do hiệu năng mã bộ đệm kém hơn.
  2. Như đã nói nó đôi khi tạo ra mã sai. Nó có thể là do lỗi tối ưu hóa hoặc lỗi trong mã (như bỏ qua bí danh nghiêm ngặt). Vì mã hạt nhân đôi khi và đôi khi phải là 'thông minh' Tôi muốn nói rằng có thể một số nhà phát triển hạt nhân đã mắc một số lỗi. Tôi đã trải qua nhiều vấn đề kỳ lạ khác nhau, như sự cố các tiện ích không gian người dùng, khi tôi biên dịch kernel với gcc 4.5 mà tại thời điểm đó thì ổn định. Tôi vẫn sử dụng gcc 4.4 cho kernel và một số tiện ích không gian người dùng được chọn do nhiều lỗi khác nhau. Điều tương tự có thể áp dụng cho -O3.
  3. Tôi không nghĩ rằng nó mang lại nhiều lợi ích cho nhân Linux. Hạt nhân không làm các tính toán nặng nề và ở những nơi nó làm, nó được tối ưu hóa với lắp ráp. -O3cờ sẽ không thay đổi chi phí chuyển đổi ngữ cảnh hoặc tốc độ của I / O. Tôi không nghĩ một cái gì đó như <0,1% tăng tốc hiệu suất tổng thể là xứng đáng.

6
Linux được biên dịch với hàm răng cưa nghiêm ngặt vì Linus nghĩ rằng gcc là ngu ngốc và quá hạn chế vì nó làm những điều ngu ngốc như coi các giá trị là khác nhau mặc dù chúng rõ ràng là không (nghĩa là răng cưa được giới thiệu bên trong một hàm và trình biên dịch có thể nhìn thấy nó). xem mail-archive.com/linux-btrfs@vger.kernel.org/msg01647.html
Spudd86

@ Spudd86: Ý của anh ấy rõ ràng là chúng không dành cho con người đọc mã hay trình biên dịch? Như tôi đã nói - Kernel đôi khi cần phải làm những điều thông minh mà các chương trình không gian người dùng không nên làm. Điều gì có ý nghĩa đối với không gian người dùng (tối ưu hóa nặng ở một số khu vực) có thể không có ý nghĩa đối với kernel (số lượng lớn hơn của mã thông minh + nút cổ chai ở những nơi khác nhau).
Maciej Piechotka

1
Không có những gì ông nói áp dụng cho không gian người dùng quá.
Spudd86

1
@ Spudd86: Tôi không đồng ý với nó sau đó. Làm cho trình biên dịch 'đủ thông minh' để phát hiện ra những điều 'hiển nhiên' như vậy không phải là chuyện nhỏ. Vì vậy, cách duy nhất có thể là a) chỉ tạo mã chậm (er) (không thể chấp nhận được đối với một số trường hợp sử dụng, giả sử, HPC) và / hoặc buộc các lập trình viên phải tối ưu hóa mã b) theo cách thủ công để cho phép các quy tắc chặt chẽ hơn để cho phép 'dumber' trình biên dịch để thực hiện tối ưu hóa - tuyến đường được thực hiện theo tiêu chuẩn C.
Maciej Piechotka

6

Lưu ý rằng các khối lớn của chuỗi công cụ (cụ thể là glibc) không được biên dịch nếu bạn thay đổi mức tối ưu hóa. Hệ thống xây dựng được thiết lập để bỏ qua các tùy chọn -O của bạn cho các phần này trên hầu hết các bản phát hành lành mạnh.

Nói một cách đơn giản, một số tính năng thư viện và hệ điều hành cơ bản nhất định phụ thuộc vào mã thực sự làm những gì nó nói, chứ không phải những gì sẽ nhanh hơn trong nhiều trường hợp. -fgcse-after-load nói riêng (được bật bởi -O3) có thể gây ra sự cố kỳ lạ.


5

Trong hơn 10 năm qua, tôi đã chạy nhiều hệ thống Gentoo với hơn 1000 gói sử dụng -O3 -march=nativetrên toàn cầu và vẫn chưa gặp phải bất kỳ vấn đề ổn định huyền thoại nào -O3đáng lẽ phải có. Điểm chuẩn của các ứng dụng chuyên sâu về CPU (như ứng dụng toán học / khoa học) luôn hiển thị -O3để tạo mã nhanh hơn, sau tất cả, sẽ là vô nghĩa nếu không. Đối với phần lớn các ứng dụng máy tính để bàn CFLAGSdù sao cũng không quan trọng bằng vì chúng bị ràng buộc IO, nhưng nó rất quan trọng đối với các công cụ phía máy chủ bị ràng buộc CPU.


3

-O3 sử dụng một số tối ưu hóa mạnh mẽ chỉ an toàn nếu một số giả định nhất định về việc sử dụng thanh ghi, cách các khung ngăn xếp được tương tác và tái bảo vệ chức năng là đúng và các giả định này không được đảm bảo là đúng trong một số mã như kernel, đặc biệt là khi lắp ráp nội tuyến được sử dụng (vì nó nằm trong một số phần rất thấp của kernel và các mô-đun trình điều khiển của nó).


Chưa kể nó không phải lúc nào cũng nhanh hơn, bạn phải thực sự đưa ra các tiêu chuẩn và kiểm tra nó với -O2việc biết thời tiết hay không, nó có đau hay không
Spudd86

0

Mặc dù bạn có thể thoát khỏi việc sử dụng -O3 và các nút tối ưu hóa khác trên hầu hết các ứng dụng (và nó có thể giúp cải thiện tốc độ), tôi sẽ ngần ngại sử dụng các tinh chỉnh đó như chính hạt nhân hoặc trên chuỗi công cụ cần thiết để xây dựng nó (trình biên dịch, binutils, v.v.)

Hãy suy nghĩ về nó: Là mức tăng hiệu suất 5% của các hệ thống con đột kích và ext3 có đáng bị sập hệ thống hoặc mất dữ liệu tiềm năng và / hoặc tham nhũng không?

Tinh chỉnh tất cả các nút cần cho cổng Quake mà bạn đang phát hoặc codec âm thanh / video bạn sử dụng để trích xuất bộ sưu tập DVD của mình sang các tệp divx. Bạn có thể sẽ thấy một sự cải thiện. Đừng lộn xộn với hạt nhân trừ khi bạn có thời gian để lãng phí và dữ liệu bạn có thể chịu mất.


3
Tôi không hỏi liệu nó có giá trị hay không, an toàn hay không, hoặc tại sao chúng ta không nên làm điều này, điều tôi đang hỏi là thực tế, nó có thực sự tạo ra lỗi trong ứng dụng thực không?, Nó có xảy ra không?, nó đã chứng minh như vậy chưa ..
uray
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.