Aprimoramentos no Inliner do C ++: o Zipliner

As versões 16.3 e 16.4 do Visual Studio 2019 incluem melhorias no inliner do C ++. Entre elas, está a capacidade de alinhar algumas rotinas após serem otimizadas, chamadas de "Zipliner". Dependendo do seu aplicativo, você poderá observar pequenas melhorias na qualidade do código e / ou grandes melhorias no tempo de compilação (taxa de transferência do compilador).


C2 inliner


Terry Mahaffey forneceu uma visão geral das decisões internas do Visual Studio . Isso detalha algumas das restrições e áreas de melhoria do interno, algumas das quais são particularmente relevantes aqui:

  1. O inliner é recursivo e muitas vezes pode refazer o trabalho que já fez. As decisões em linha são sensíveis ao contexto e nem sempre é rentável reproduzir sua tomada de decisão para a mesma função.
  2. O inliner é muito consciente do orçamento. Ele tem o trabalho difícil de equilibrar o tamanho do executável com o desempenho do tempo de execução.
  3. A visão de mundo do inliner é sempre "pré-otimizada". Ela tem um conhecimento muito limitado da propagação de cópias e caminhos de controle morto, por exemplo.

C ++ moderno


Infelizmente, muitos dos padrões e idiomas de codificação comuns à programação genérica pesada colidem com essas restrições. Considere a seguinte rotina na biblioteca Eigen :

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

que chama innerSize:

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

Essa instanciação de outerStride não faz nada além de retornar um de seus membros. Portanto, é um excelente candidato para expansão total em linha. Para obter essa vitória, o compilador deve avaliar e expandir completamente as 18 callees totais do outerStride, para cada local de chamada do outerStride no módulo. Isso consome tanto a taxa de transferência do otimizador quanto o orçamento de tamanho de código do inliner. Também é importante mencionar que as chamadas para 'linhas' e 'colunas' também são expandidas em linha, mesmo que elas estejam em um caminho estaticamente morto.
Seria muito melhor se o otimizador apenas informasse o retorno do membro de duas linhas:

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


Para um subconjunto de rotinas, o inliner agora expandirá o RI já otimizado de uma rotina, ignorando o processo de busca de RI e re-expandindo callees. Isso tem o duplo objetivo de expandir os callites muito mais rapidamente, além de permitir que o inliner avalie seu orçamento com mais precisão.

Primeiro, o otimizador resumirá que o outerStride é candidato a essa expansão mais rápida quando é compilado originalmente (lembre-se de que o c2.dll tenta compilar rotinas antes de seus chamadores). Em seguida, o inliner pode substituir as chamadas para essa instanciação outerStride pelo acesso ao campo.

Os candidatos a essa expansão inline mais rápida são funções de folha sem locais, que se referem a no máximo dois argumentos diferentes, globais ou constantes. Na prática, isso visa aos getters e setters mais simples.

Benefícios


Existem muitos exemplos como outerStride na biblioteca Eigen, onde uma grande árvore de chamadas se expande em apenas uma ou duas instruções. Módulos que fazem uso pesado de Eigen podem ter uma melhora significativa na taxa de transferência; medimos o otimizador levando de 25 a 50% menos tempo para esses repros.

O novo Zipliner também permitirá ao inliner medir seu orçamento com mais precisão. Os desenvolvedores de Eigen há muito sabem que o MSVC não está alinhado com suas especificações (consulte EIGEN_STRONG_INLINE). O Zipliner deve ajudar a aliviar parte dessa preocupação, já que uma rotina com tirolesa é agora considerada uma linha virtualmente "gratuita".

Experimente o recurso


Isso é ativado por padrão no Visual Studio 2019 16.3, junto com algumas melhorias no 16.4. Faça o download do Visual Studio 2019 e experimente as novas melhorias. Podemos ser contatados pelos comentários abaixo ou por e-mail (visualcpp@microsoft.com). Se você encontrar problemas com o Visual Studio ou MSVC ou tiver uma sugestão para nós, informe-nos através de Ajuda> Enviar comentários> Relatar um problema / Fornecer uma sugestão no produto ou na Comunidade de desenvolvedores . Você também pode encontrar-nos no Twitter ( @VisualC ).

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


All Articles