2013-02-22 8 views
10

Giả sử tôi có một đơn vị biên dịch bao gồm ba hàm, A, B và C. A được gọi một lần từ hàm bên ngoài đơn vị biên dịch (ví dụ: đó là điểm nhập hoặc gọi lại); B được gọi nhiều lần bởi A (ví dụ, nó được gọi trong một vòng lặp chặt chẽ); C được gọi một lần bởi mỗi lời gọi B (ví dụ: đó là hàm thư viện).Ngữ nghĩa của thuộc tính nóng GCC

Toàn bộ đường đi qua A (đi qua B và C) là quan trọng về hiệu suất, mặc dù hiệu suất của bản thân A không quan trọng (vì phần lớn thời gian được sử dụng trong B và C).

Bộ chức năng tối thiểu nào cần chú thích với __attribute__ ((hot)) để thực hiện tối ưu hóa tích cực hơn cho đường dẫn này? Giả sử chúng tôi không thể sử dụng -fprofile-generate.

Tương đương: __attribute__ ((hot)) có nghĩa là "tối ưu hóa nội dung của chức năng này", "tối ưu hóa cuộc gọi đến chức năng này", "tối ưu hóa tất cả các cuộc gọi con cháu mà chức năng này tạo ra" hay kết hợp chúng?

Trang thông tin GCC không giải quyết rõ ràng các câu hỏi này.

+0

'__attribute__ ((hot))' có thể giúp bạn một cái gì đó, nhưng bạn có thể nhận được kết quả tốt hơn từ đầu tiên làm cho cả hai B và C 'static inline' và tối ưu hóa với' -O3'. – twalberg

+0

Tôi giả định rằng các bước đã được thực hiện. –

Trả lời

13

Official documentation:

hot Thuộc tính nóng trên một chức năng được sử dụng để thông báo cho trình biên dịch rằng chức năng là một điểm nóng của chương trình biên dịch. Chức năng được tối ưu hóa mạnh mẽ hơn và trên nhiều mục tiêu nó được đặt vào phần phụ đặc biệt của phần văn bản để tất cả các chức năng nóng xuất hiện gần nhau cải thiện địa phương. Khi có phản hồi hồ sơ, thông qua sử dụng hồ sơ, các chức năng nóng được tự động phát hiện và thuộc tính này bị bỏ qua.

Thuộc tính nóng về chức năng không được triển khai trong các phiên bản GCC sớm hơn 4.3.

Thuộc tính nóng trên nhãn được sử dụng để thông báo cho trình biên dịch rằng đường dẫn theo nhãn có nhiều khả năng hơn đường dẫn không được chú thích. Thuộc tính này được sử dụng trong trường hợp không thể sử dụng __builtin_expect, ví dụ với goto tính toán hoặc goto được tính toán.

Thuộc tính nóng trên nhãn không được triển khai trong các phiên bản GCC sớm hơn 4.8.

2007:

__attribute__((hot)) 

Gợi ý rằng chức năng đánh dấu là "nóng" và cần được tối ưu hóa aggresively hơn và/hoặc đặt gần các chức năng khác "nóng" (đối với địa phương bộ nhớ cache).

Gilad Ben-Yossef:

Như tên gọi của họ cho thấy, những thuộc tính chức năng được sử dụng để gợi ý trình biên dịch rằng các chức năng tương ứng được gọi là thường trong mã của bạn (nóng) hoặc hiếm khi gọi (lạnh). Trình biên dịch sau đó có thể đặt mã trong các nhánh, chẳng hạn như báo cáo, để ưu tiên các nhánh gọi các chức năng nóng này và chức năng disfavour chức năng lạnh, theo giả định rằng nhiều khả năng chi nhánh sẽ được thực hiện gọi một chức năng nóng và ít có khả năng gọi một cái lạnh.Ngoài ra, trình biên dịch có thể chọn nhóm các chức năng được đánh dấu là nóng trong phần đặc biệt trong tệp nhị phân được tạo, trên cơ sở dữ liệu và bộ nhớ hướng dẫn hoạt động dựa trên địa phương hoặc khoảng cách tương đối của mã và dữ liệu có liên quan , đặt tất cả các chức năng thường gọi là cùng nhau sẽ dẫn đến bộ nhớ đệm tốt hơn của mã của họ cho toàn bộ ứng dụng.

Ứng cử viên tốt cho thuộc tính nóng là các chức năng chính được gọi rất thường xuyên trong cơ sở mã của bạn. Các ứng cử viên tốt cho thuộc tính lạnh là các hàm xử lý lỗi nội bộ được gọi chỉ trong trường hợp có lỗi.

Vì vậy, theo các nguồn tin, __attribute__ ((hot)) có nghĩa là:

  • tối ưu hóa các cuộc gọi đến chức năng này
  • tối ưu hóa cơ thể của chức năng này
  • đặt cơ thể của chức năng này để .hot phần (để nhóm tất cả mã nóng ở một vị trí)

Sau khi phân tích mã nguồn, chúng tôi có thể nói rằng "nóng" thuộc tính được kiểm tra với (lookup_attribute ("hot", DECL_ATTRIBUTES (current_function_decl)); và khi nó là đúng, các chức năng của node->frequency được thiết lập để NODE_FREQUENCY_HOT (predict.c, compute_function_frequency()).

Nếu chức năng có tần số như NODE_FREQUENCY_HOT,

  • Nếu không có thông tin cấu hình và không likely/unlikely trên cành, maybe_hot_frequency_p sẽ trở lại đúng với chức năng (==" ... FREQ tần số được coi nóng. "). Điều này biến giá trị của maybe_hot_bb_p thành true cho tất cả các khối cơ bản (BB) trong hàm ("BB có thể là CPU chuyên sâu và cần được tối ưu hóa cho hiệu suất tối đa.") Và maybe_hot_edge_p đúng cho tất cả các cạnh trong hàm. Lần lượt trong không -Os -modes BB và cạnh và cũng vòng sẽ được tối ưu hóa cho tốc độ, không cho kích thước.

  • Đối với tất cả các cạnh cuộc gọi đi từ chức năng này, cgraph_maybe_hot_edge_p sẽ trả về true ("Trả về true nếu cuộc gọi có thể nóng."). Cờ này được sử dụng trong IPA (ipa-inline.c, ipa-cp.c, ipa-inline-analysis.c) và ảnh hưởng đến các quyết định nội tuyến và nhân bản

+0

Đừng nghĩ vậy. Nó là không đầy đủ, và một số thí nghiệm là cần thiết. Tôi nghĩ, nóng cũng có thể ảnh hưởng đến mã, được gọi là từ chức năng nóng. – osgx

+1

bạn có thể mong đợi gcc ngay bây giờ hoặc trong tương lai để truyền bá tính nóng của một hàm cho tổ tiên và các nhánh con và các chức năng mà chúng gọi là gcc có thể xác định biểu đồ cuộc gọi. – codeshot

+0

@codeshot Nếu điều này được thực hiện một cách mù quáng cho tất cả tổ tiên và hậu duệ thì phần lớn thời gian toàn bộ chương trình sẽ được đánh dấu là nóng, phải không? Cũng trong kịch bản mà một hàm có nhiều tổ tiên và chỉ có một tổ chức thường được sử dụng thì đây sẽ là một sự lãng phí. – Jeevaka