C ++ - Inliner-Verbesserungen: Der Zipliner

Visual Studio 2019- Versionen 16.3 und 16.4 enthalten Verbesserungen des C ++ - Inliners. Dazu gehört die Möglichkeit, einige Routinen, die nach der Optimierung als "Zipliner" bezeichnet werden, zu integrieren. Abhängig von Ihrer Anwendung können geringfügige Verbesserungen der Codequalität und / oder erhebliche Verbesserungen der Build-Zeit (Compiler-Durchsatz) zu verzeichnen sein.


C2 Inliner


Terry Mahaffey hat einen Überblick über die Inlining-Entscheidungen von Visual Studio gegeben . Hier werden einige Einschränkungen und Verbesserungsmöglichkeiten des Inliners aufgeführt, von denen einige hier besonders relevant sind:

  1. Der Inliner ist rekursiv und führt möglicherweise die bereits ausgeführten Arbeiten erneut aus. Inline-Entscheidungen sind kontextsensitiv und es lohnt sich nicht immer, die Entscheidungsfindung für dieselbe Funktion zu wiederholen.
  2. Der Inliner ist sehr budgetbewusst. Es hat die schwierige Aufgabe, die Größe der ausführbaren Dateien mit der Laufzeitleistung in Einklang zu bringen.
  3. Die Sicht des Inliners auf die Welt ist immer "voroptimiert". Beispielsweise sind nur sehr begrenzte Kenntnisse über die Fortpflanzung von Kopien und über Dead Control-Pfade vorhanden.

Modernes C ++


Leider stoßen viele der Codierungsmuster und -idiome, die bei schwerer generischer Programmierung häufig vorkommen, auf diese Einschränkungen. Betrachten Sie die folgende Routine in der Eigen-Bibliothek :

Eigen::Matrix<float,-1,1,0,-1,1>::outerStride(void) 

welches innerSize aufruft:

 template<typename Derived> class DenseBase ... Index innerSize() const {    return IsVectorAtCompileTime ? this->size()        : int(IsRowMajor) ? this->cols() : this->rows(); } 

Diese Instanziierung von OuterStride gibt nur eines seiner Mitglieder zurück. Daher ist es ein ausgezeichneter Kandidat für eine vollständige Inline-Erweiterung. Um diesen Gewinn zu erzielen, muss der Compiler die 18 Aufrufe von OuterStride für jede Aufrufseite von OuterStride im Modul vollständig auswerten und erweitern. Dies wirkt sich sowohl auf den Durchsatz des Optimierers als auch auf das Budget für die Codegröße des Inliners aus. Es ist auch zu erwähnen, dass Aufrufe von 'rows' und 'cols' auch inline-expandiert werden, obwohl sich diese auf einem statisch toten Pfad befinden.
Es wäre viel besser, wenn das Optimierungsprogramm nur die zweizeilige Member-Rückgabe einfügt:

 ?outerStride@?$Matrix@N$0?0$0?0$0A@$0?0$0?0@Eigen@@QEBA_JXZ PROC ; Eigen::Matrix<double,-1,-1,0,-1,-1>::outerStride, COMDAT mov    rax, QWORD PTR [rcx+8]    ret 0 

Inlining Optimiertes IR


Für eine Untergruppe von Routinen erweitert der Inliner jetzt das bereits optimierte IR einer Routine, umgeht den Vorgang des Abrufens von IR und erweitert Callees erneut. Dies hat den doppelten Zweck, die Anzahl der aufgerufenen Websites erheblich zu erhöhen und den Inliner das Budget genauer messen zu lassen.

Zunächst fasst der Optimierer zusammen, dass OuterStride ein Kandidat für diese schnellere Erweiterung ist, wenn es ursprünglich kompiliert wurde. Dann kann der Inliner Aufrufe an diese Instanz von OuterStride durch den Feldzugriff ersetzen.

Die Kandidaten für diese schnellere Inline-Expansion sind Blattfunktionen ohne Einheimische, die sich auf höchstens zwei verschiedene Argumente, Globale oder Konstanten beziehen. In der Praxis zielt dies auf die einfachsten Getter und Setter ab.

Vorteile


Es gibt viele Beispiele wie OuterStride in der Eigen-Bibliothek, in denen ein großer Aufrufbaum in nur ein oder zwei Anweisungen erweitert wird. Module, die Eigen stark nutzen, können eine signifikante Durchsatzverbesserung verzeichnen. Wir haben gemessen, dass der Optimierer bis zu 25-50% weniger Zeit für solche Repros benötigt.

Mit dem neuen Zipliner kann der Inliner auch sein Budget genauer messen. Eigenentwickler sind sich seit langem bewusst, dass MSVC nicht ihren Spezifikationen entspricht (siehe EIGEN_STRONG_INLINE). Der Zipliner sollte dazu beitragen, einige dieser Bedenken auszuräumen, da eine ziplinierte Routine jetzt als praktisch "freie" Inline angesehen wird.

Probieren Sie das Feature aus


Dies ist in Visual Studio 2019 16.3 zusammen mit einigen Verbesserungen in 16.4 standardmäßig aktiviert. Laden Sie Visual Studio 2019 herunter und probieren Sie die neuen Verbesserungen aus. Sie erreichen uns über die folgenden Kommentare oder per E-Mail (visualcpp@microsoft.com). Wenn Sie Probleme mit Visual Studio oder MSVC haben oder einen Vorschlag für uns haben, teilen Sie uns dies bitte über Hilfe> Feedback senden> Problem melden / Vorschlag im Produkt oder über die Entwickler-Community mit . Sie finden uns auch auf Twitter ( @VisualC ).

Source: https://habr.com/ru/post/de483336/


All Articles