2013-03-25 29 views
18

Tôi đang đọc: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlg ++ Flags Tối ưu hóa: -fuse-linker-plugin vs -fwhole chương trình

Nó đầu tiên gợi ý: Kết hợp với -flto sử dụng tùy chọn này (-fwhole chương trình) không nên được sử dụng. Thay vào đó, việc dựa vào plugin trình liên kết sẽ cung cấp thông tin chính xác hơn và an toàn hơn cho thông tin .

Và sau đó, nó cho thấy: Nếu chương trình không đòi hỏi bất kỳ biểu tượng để được xuất khẩu, chúng ta có thể kết hợp -flto-fwhole chương trình cho phép tối ưu interprocedural sử dụng các giả định tích cực hơn điều này có thể dẫn đến các cơ hội tối ưu hóa được cải thiện. Sử dụng -fwhole-program là không cần thiết khi plugin trình liên kết đang hoạt động (xem -fuse-linker-plugin).

Liệu nó có nghĩa rằng về mặt lý thuyết, sử dụng -fuse-linker-plugin với -flto luôn được một được tối ưu hóa tốt hơn so với sử dụng thực thi -fwhole chương trình với -flto?

Tôi cố gắng để sử dụng ld để liên kết với -fuse-linker-plugin-fwhole chương trình riêng biệt, và kích thước của các tập tin thực thi ít nhất là khác nhau.

Xin cảm ơn trước.

P.S. Tôi đang sử dụng gcc 4.6.2 và ld 2.21.53.0.1 trên CentOS 6.

+1

fwiw, theo báo giá của bạn - "Sử dụng chương trình -fwhole là không cần thiết khi plugin trình liên kết đang hoạt động (xem -fuse-linker-plugin)." - sau này chúng tôi thấy trong tài liệu - ** "Tùy chọn này [' -fuse-linker-plugin'] được bật theo mặc định khi hỗ trợ LTO trong GCC được bật và GCC được định cấu hình để sử dụng với trình hỗ trợ trình liên kết (GNU ld 2.21 hoặc mới hơn hoặc vàng). "** - vì vậy tôi sẽ đoán rằng bao gồm hầu hết các cài đặt hiện đại hợp lý của gcc. có nghĩa là chúng có một tùy chọn mặc định làm cho '-fwhole-program' không cần thiết. nhưng đây chỉ là cách giải thích của tôi về tất cả! –

Trả lời

1

Những khác biệt này rất tinh tế. Trước tiên, hãy hiểu những gì thực tế là -flto. Về cơ bản nó tạo ra một đầu ra có thể được tối ưu hóa sau này (tại "thời gian liên kết").

-fwhole chương trình làm là giả "rằng đơn vị biên dịch hiện đại diện cho toàn bộ chương trình được biên soạn" hay không mà thực sự là trường hợp. Do đó, GCC sẽ giả định rằng nó biết tất cả những nơi gọi một hàm cụ thể. Như nó nói, nó có thể sử dụng các trình tối ưu hóa đa thủ tục tích cực hơn. Tôi sẽ giải thích điều đó một chút.

Cuối cùng, những gì -fuse-linker-plugin thực sự thực hiện tối ưu hóa tại thời gian liên kết thường được thực hiện khi mỗi đơn vị biên dịch được thực hiện. Vì vậy, cái này được thiết kế để ghép nối với -flto-flto có nghĩa là lưu đủ thông tin để tối ưu hóa sau và -fuse-linker-plugin có nghĩa là thực sự thực hiện những tối ưu hóa đó.

Vì vậy, chúng khác nhau ở đâu? Vâng, như GCC doc cho thấy, không có lợi thế về nguyên tắc sử dụng -fwhole-program vì tùy chọn đó giả định một cái gì đó mà bạn sau đó phải đảm bảo là đúng sự thật. Để phá vỡ nó, chỉ cần định nghĩa một hàm trong một tệp .cpp và sử dụng nó trong một tệp khác. Bạn sẽ gặp lỗi liên kết.

Có lợi thế nào cho -fwhole-program? Vâng, nếu bạn chỉ có một đơn vị biên dịch thì bạn có thể sử dụng nó, nhưng thành thật mà nói, nó sẽ không tốt hơn. Tôi đã có thể nhận được các tập tin thực thi có kích thước khác nhau bằng cách sử dụng các chương trình tương đương, nhưng khi kiểm tra mã máy được tạo ra thực tế, chúng giống hệt nhau. Trong thực tế, sự khác biệt duy nhất mà tôi thấy là các số dòng với thông tin gỡ lỗi khác nhau.