2017-07-08 13 views
7

Quoted from https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html:Tại sao GCC cho phép tối ưu hóa tại O2/O3 khi nó rõ ràng nói rằng nó sẽ làm chậm chương trình?

-falign-nhãn

-falign-nhãn = n

Align tất cả các mục tiêu chi nhánh để một ranh giới điện-of-hai, bỏ qua lên đến n byte như - hàm falign. Tùy chọn này có thể dễ dàng làm cho mã chậm hơn, vì nó phải chèn hoạt động giả cho khi mục tiêu chi nhánh đạt được trong luồng thông thường của mã.

-fno-align-labels và -falign-label = 1 tương đương và có nghĩa là nhãn không được căn chỉnh.

Nếu các vòng lặp -falign hoặc -falign-jump được áp dụng và lớn hơn giá trị này, thì giá trị của chúng được sử dụng thay thế.

Nếu n không được chỉ định hoặc bằng 0, hãy sử dụng mặc định phụ thuộc máy rất có khả năng là ‘1’, nghĩa là không có căn chỉnh.

Được bật ở các mức -O2, -O3.

Suy nghĩ về lá cờ này nhiều hơn làm cho nó mất cảm giác nhiều hơn ... có những hậu quả của kích thích đang nhớ cache miss, và những gì thậm chí tạo điều kiện cho phương tiện khi tham số có giá trị số (1 ..)?

+1

"Nếu n chưa được chỉ định hoặc bằng 0, sử dụng mặc định phụ thuộc vào máy rất có thể là '1'. Vì vậy, theo mặc định, gcc sử dụng giá trị phụ thuộc vào máy – Justin

+1

IIRC, đây là một tối ưu hóa kích thước. – stybl

+1

Đây là một câu hỏi thú vị; Cảm ơn vì đăng. –

Trả lời

5

Nó không nói vậy. Nó nói rằng có thể dễ dàng tạo mã chậm hơn. Nó có nghĩa là, trong một số trường hợp, nó có thể làm cho mã chậm hơn. Trong các tình huống khác, nó có thể làm cho mã nhanh hơn.

Alignment gây để chạy mã chậm:

  • tăng kích thước mã, vì vậy có một cơ hội cao hơn mà một mã không có trong bộ nhớ cache.
  • thêm nop hoạt động chậm lại đang

Alignment có thể gây ra để chạy mã nhanh hơn: dự đoán rẽ nhánh, hướng dẫn lấy, và thần-biết-gì.

Trong trường hợp một if, khó có thể nói hiệu ứng nào mạnh hơn. Nó phụ thuộc vào các điều kiện.

Tuy nhiên, đối với vòng lặp, thường mã sẽ nhanh hơn. Tại sao? Bởi vì các yếu tố chậm chỉ xảy ra một lần, nhưng mỗi chu kỳ của vòng lặp sẽ được thực hiện nhanh hơn.

(GCC của tôi dường như căn chỉnh nhãn thành 8)

Các vấn đề liên quan