Semantik von GCC hot-Attribut
Nehme an, ich habe eine compilation-unit, bestehend aus drei Funktionen, A, B, und C. A wird einmal aufgerufen, der von einer Funktion extern zu der compilation-unit (z.B. es ist ein Einstiegspunkt oder callback); B aufgerufen wird oft durch Einen (es ist z.B. aufgerufen, in einer engen Schleife); C wird einmal aufgerufen, die von jedem Aufruf von B (es ist z.B. eine library-Funktion).
Den gesamten Weg über Eine (Weitergabe durch B und C) ist performance-kritisch, wenn die Leistung von Einem selbst ist nicht-kritisch (wie die meiste Zeit wird damit verbracht, in B und C).
Was ist der minimale Satz von Funktionen, die sollte man kommentieren mit __attribute__ ((hot))
um die Wirkung aggressiver Optimierung dieser Pfad? Übernehmen, die wir nicht verwenden -fprofile-generate
.
Sinngemäß: Tut __attribute__ ((hot))
bedeutet "Optimierung der Körper von dieser Funktion", "optimieren Sie diese Funktion aufrufen", "alle optimieren Nachkomme ruft diese Funktion macht", oder eine Kombination davon?
Die GCC info-Seite nicht klar auf diese Fragen eingehen.
__attribute__ ((hot))
vielleicht gewinnen Sie etwas, aber Sie bessere Ergebnisse aus, dass zuerst B und Cstatic inline
und Optimierung mit-O3
.- Ich gehe davon aus, dass diejenigen, die bereits ergriffen worden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offizielle Dokumentation:
Zwei tausend sieben:
Gilad Ben-Yossef:
So, nach diesen Quellen,
__attribute__ ((hot))
bedeutet:.hot
Abschnitt (Gruppe alle heißen-code in einem Ort)After source code Analyse können wir sagen, dass "hot" - Attribut markiert ist mit
(lookup_attribute ("hot", DECL_ATTRIBUTES (current_function_decl))
; und wenn es wahr ist, werden die Funktionen dernode->frequency
eingestellt istNODE_FREQUENCY_HOT
(Vorhersagen.c, compute_function_frequency()).Wenn die Funktion Frequenz als
NODE_FREQUENCY_HOT
,Wenn es keine Profil-Informationen und keine
likely/unlikely
auf den Zweigen,maybe_hot_frequency_p
wird true zurückgegeben, für die Funktion (== "...Frequenz FREQ ist als heiß zu sein."). Dieser stellt den Wertmaybe_hot_bb_p
in gilt für alle Basic Blocks (BB) in die Funktion ("BB kann CPU-intensiv und sollte optimiert werden für die maximale Leistung.") undmaybe_hot_edge_p
gilt für alle Kanten in Funktion. Wiederum in nicht-Os
-Modi diese BB und Kanten und auch die Schleifen sind optimiert für Geschwindigkeit, nicht für Größe.Für alle outbound-call-Kanten, die von dieser Funktion,
cgraph_maybe_hot_edge_p
wird Rückgabe true ("true" Zurück, wenn der Aufruf kann heiß sein."). Dieses flag verwendet wird in der IPA (ipa-inline.c, ipa-cp.c, ipa-inline-Analyse.c) und Einfluss inline und Klonen Entscheidungen