Tôi tình cờ xem chủ đề này bằng một con đường tôi thậm chí không thể nhớ và đang học cụ này như tôi đi cùng. Nhưng tôi không thích nhìn thấy một câu hỏi chưa được trả lời nếu tôi có thể học được điều gì đó từ nó! Vì vậy, tôi đã đọc.
Tối ưu hóa được hướng dẫn phản hồi
Như GCC nói, cả hai đều là phương thức áp dụng Tối ưu hóa được hướng dẫn phản hồi. Bằng cách chạy chương trình và profiling những gì nó làm, làm thế nào nó có phải nó, bao lâu nó dành trong đó chức năng, vv - chúng tôi có thể tạo điều kiện thêm, optimisations đạo từ dữ liệu kết quả. Các kết quả từ profiler được 'fed forward' tới trình tối ưu hóa. Tiếp theo, có lẽ, bạn có thể lấy tiểu sử và cấu hình được tối ưu hóa tiểu sử của mình mà, sau đó biên dịch một phiên bản FDO khác, v.v ... do đó, phản hồi một phần của tên.
Câu trả lời thực sự, sự khác biệt giữa hai công tắc này, không được ghi chép rõ ràng, nhưng có sẵn nếu chúng ta chỉ cần nhìn xa hơn một chút.
-fprofile sử dụng
Thứ nhất, báo giá của bạn cho -fprofile-use
chỉ thực sự khẳng định rằng nó đòi hỏi -fprofile-generate
, một lựa chọn mà không phải là rất tốt tài liệu: tài liệu tham khảo từ -use
chỉ nói với bạn đọc trang bạn đã được bật, trong mọi trường hợp, -generate
chỉ được đề cập nhưng không bao giờ được xác định. Hữu ích! Nhưng! Chúng ta có thể tham khảo các câu trả lời cho câu hỏi này: How to use profile guided optimizations in g++?
Như rằng các quốc gia trả lời, và các mảnh của tài liệu hướng dẫn của GCC trong câu hỏi ở đây nhẹ nhàng chỉ ra ... -fprofile-generate
gây instrumentation để được thêm vào nhị phân đầu ra. Khi trang đó tóm tắt, một tệp thực thi có công cụ có thêm các công cụ để tạo điều kiện kiểm tra bổ sung hoặc thông tin chi tiết trong thời gian chạy của nó.
(Hình thức thiết bị khác mà tôi biết - và phương tiện tôi đã sử dụng - là thư viện tiện ích bổ sung của trình biên dịch UBSan, mà tôi sử dụng qua GCC's -fsanitize=undefined
option. Điều này nắm bắt các bit của Hành vi không xác định khi chạy. tiết lộ UB tôi có thể đã khác lấy thời gian dài để tìm - và làm cho tôi tự hỏi như thế nào chương trình của tôi chạy ở tất cả Clang can use this library too, và có thể trình biên dịch khác)
-fauto hồ sơ
Ngược lại, -fauto-profile
là khác nhau!.. Sự khác biệt chính là gợi ý, nếu không muốn nói rõ ràng, trong tóm tắt bạn trích dẫn cho nó:
path
là tên của một tập tin chứa AutoFDO thông tin hồ sơ.
Chế độ này xử lý hồ sơ và tối ưu hóa tiếp theo bằng cách sử dụng AutoFDO. Để Google, chúng tôi đi: AutoFDO Một vài dòng đầu tiên không giải thích điều này như một cách ngắn gọn càng tốt, và tôi nghĩ rằng bản tóm tắt tốt nhất được chôn cất khá xa xuống phía dưới trang:
Sự khác biệt lớn giữa AutoFDO [-fauto-profile
] và FDO [-fprofile-use
] là cấu hình AutoFDO trên nhị phân được tối ưu hóa thay vì nhị phân được thiết bị. Điều này làm cho nó rất khác nhau trong việc xử lý các chức năng nhân bản.
Làm cách nào để thực hiện việc này? -fauto-profile
yêu cầu bạn cung cấp các tệp lược tả được viết bởi trình biên dịch hạt nhân Linux, Perf, được chuyển đổi sang định dạng AutoFDO. Perf, thay vì thêm thiết bị đo đạc, sử dụng các tính năng phần cứng của CPU và hạt nhân cấp tính năng của hệ điều hành đến hồ sơ thống kê khác nhau về một chương trình trong khi nó đang chạy:
perf
là mạnh mẽ: nó có thể đếm hiệu suất công cụ CPU, tracepoints , kprobes và uprobes (theo dõi động). Nó có khả năng định hình nhẹ. [...] Các bộ đếm hiệu năng là các thanh ghi phần cứng CPU đếm các sự kiện phần cứng như các lệnh được thực hiện, bộ nhớ cache bị thiếu hoặc các nhánh bị sai lệch. Chúng tạo thành cơ sở cho các ứng dụng lược tả để theo dõi luồng điều khiển động và xác định các điểm nóng.
Vì vậy, điều đó cho phép nó cấu hình một chương trình được tối ưu hóa, thay vì chương trình được thiết kế.Chúng tôi có thể giả định hợp lý điều này là đại diện hơn về cách chương trình của bạn sẽ phản ứng trong thế giới thực - và vì vậy có thể tạo điều kiện thu thập dữ liệu hồ sơ hữu ích hơn và áp dụng các tối ưu hóa hiệu quả hơn.
Một ví dụ về làm thế nào để làm những việc của buộc tất cả điều này với nhau và nhận được -fauto-profile
để làm điều gì đó với chương trình của bạn được tóm tắt ở đây: Feedback directed optimization with GCC and Perf
(Có lẽ bây giờ mà tôi học được tất cả điều này, tôi sẽ cố gắng các tùy chọn này ra một số ngày!)