Améliorations de C ++ Inliner: The Zipliner

Les versions 16.3 et 16.4 de Visual Studio 2019 incluent des améliorations de l'inliner C ++. Parmi ceux-ci, il y a la possibilité d'inclure certaines routines après qu'elles ont été optimisées, appelées «Zipliner». Selon votre application, vous pouvez voir quelques améliorations mineures de la qualité du code et / ou des améliorations majeures au moment de la construction (débit du compilateur).


Inliner C2


Terry Mahaffey a fourni une vue d'ensemble des décisions de Visual Studio . Cela détaille certaines des contraintes de l'inliner et les domaines à améliorer, dont certains sont particulièrement pertinents ici:

  1. Le revêtement intérieur est récursif et peut souvent refaire le travail qu'il a déjà fait. Les décisions en ligne sont sensibles au contexte et il n'est pas toujours rentable de rejouer sa prise de décision pour la même fonction.
  2. La doublure est très soucieuse de son budget. Il a la tâche difficile d'équilibrer la taille de l'exécutable avec les performances d'exécution.
  3. La vision du monde de l'inliner est toujours «pré-optimisée». Elle a une connaissance très limitée de la propagation des copies et des chemins de contrôle morts par exemple.

C ++ moderne


Malheureusement, de nombreux schémas de codage et idiomes communs à la programmation générique lourde se heurtent à ces contraintes. Considérez la routine suivante dans la bibliothèque Eigen :

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

qui appelle innerSize:

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

Cette instanciation de externalStride ne fait que renvoyer l'un de ses membres. Par conséquent, c'est un excellent candidat pour une expansion en ligne complète. Pour réaliser cette victoire, le compilateur doit évaluer et étendre complètement les 18 callees totales d'ternalStride, pour chaque site d'appel d'ternalStride dans le module. Cela affecte à la fois le débit de l'optimiseur et le budget de taille de code de l'inliner. Il convient également de mentionner que les appels aux «lignes» et aux «cols» sont également développés en ligne, même s'ils sont sur un chemin statiquement mort.
Il serait préférable que l'optimiseur insère simplement le retour du membre sur deux lignes:

 ?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 Optimized IR


Pour un sous-ensemble de routines, le inliner étendra désormais l'IR déjà optimisé d'une routine, contournant le processus de récupération d'IR et de ré-expansion des callees. Cela a pour double objectif d'étendre les sites d'appels beaucoup plus rapidement et de permettre à l'inliner de mesurer son budget avec plus de précision.

Tout d'abord, l'optimiseur résumera que externalStride est un candidat pour cette expansion plus rapide lors de sa compilation initiale (rappelez-vous que c2.dll essaie de compiler des routines avant leurs appelants). Ensuite, l'inliner peut remplacer les appels à cette instanciation externalStride par l'accès au champ.

Les candidats pour cette expansion en ligne plus rapide sont des fonctions feuilles sans sections locales, qui font référence à au plus deux arguments, globaux ou constantes différents. Dans la pratique, cela cible les getters et setters les plus simples.

Bénéfices


Il existe de nombreux exemples comme externalStride dans la bibliothèque Eigen où une grande arborescence d'appels se développe en une ou deux instructions seulement. Les modules qui font un usage intensif d'Eigen peuvent voir une amélioration significative du débit; nous avons mesuré l'optimiseur en prenant jusqu'à 25 à 50% de moins de temps pour ces repros.

Le nouveau Zipliner permettra également au inliner de mesurer plus précisément son budget. Les développeurs Eigen savent depuis longtemps que MSVC ne respecte pas leurs spécifications (voir EIGEN_STRONG_INLINE). Zipliner devrait aider à atténuer une partie de cette préoccupation, car une routine ziplined est maintenant considérée comme une ligne en ligne «presque gratuite».

Essayez la fonctionnalité


Ceci est activé par défaut dans Visual Studio 2019 16.3, avec quelques améliorations dans 16.4. Veuillez télécharger Visual Studio 2019 et essayer les nouvelles améliorations. Nous pouvons être contactés via les commentaires ci-dessous ou par e-mail (visualcpp@microsoft.com). Si vous rencontrez des problèmes avec Visual Studio ou MSVC, ou si vous avez une suggestion à nous faire, veuillez nous en informer via Aide> Envoyer des commentaires> Signaler un problème / Fournir une suggestion dans le produit ou via la communauté des développeurs . Vous pouvez également nous trouver sur Twitter ( @VisualC ).

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


All Articles