FERRAMENTAS LINUX: O desempenho do GCC 13 "-O2" está sendo acelerado com a ativação do desenrolamento de pequenos loops

segunda-feira, 14 de novembro de 2022

O desempenho do GCC 13 "-O2" está sendo acelerado com a ativação do desenrolamento de pequenos loops

 

Para aqueles que compilam seus programas usando o nível de otimização "-O2" comum, como é usado para as compilações de produção por muitas distribuições Linux e outros fornecedores de software, o desenrolamento de loop pequeno está sendo habilitado neste nível para o GCC 13. Habilitando o desenrolamento de loop pequeno com -O2 deve ajudar o desempenho em algumas áreas de CPUs modernas Intel e AMD.


O engenheiro da Intel Hongyu Wang liderou a mudança que se fundiu hoje ao GCC 13. O desenrolamento de loop pequeno está sendo habilitado para o nível de otimização -O2 devido ao seu benefício com CPUs modernas AMD e Intel. Em um caso de teste específico do SPEC, ter um pequeno loop desenrolando em -O2 melhorou o desempenho do servidor Ice Lake em 9%, ajudando também um sistema Zen 3 em 7,4%. Como consequência, isso levou a um aumento de 0,9% no tamanho do código. Mas para os outros casos de referência executados, houve menos ou nenhum impacto mensurável. Claro, será interessante testar o GCC 13 com uma gama mais diversificada de benchmarks para ver como tudo corre.

Hongyu Wang explicou no commit :

"Os processadores modernos têm decodificadores de instruções de múltiplas vias Para x86, icelake/zen3 tem 5 uops, então para pequenos loops com <= 4 instruções (geralmente tem 3 uops com um par cmp/jmp que pode ser macro-fundido), o decodificador teria Bolha de 2 uops para cada iteração e o pipeline não pôde ser totalmente utilizado.

Portanto, este patch permite o desenrolamento de loop para loop de tamanho pequeno em O2 para preencher o decodificador o máximo possível. Ele ativa o desenrolamento de loop rtl quando targetm.loop_unroll_adjust existe e O2 mais velocidade apenas. No backend x86, o comportamento padrão é desenrolar pequenos loops com menos de 4 insns por 1 vez.

Isso melhora o 548.exchange2 em 9% no icelake e 7,4% no zen3 com incremento de 0,9% no tamanho do código. Para outros benchmarks, as variantes são menores e o tamanho geral do código aumentou 0,2%.

O tamanho da imagem do kernel aumentou 0,06% e nenhum impacto no eembc."

Essa alteração é mesclada para GCC 13 com -O2. A versão estável do GCC 13.1 deve sair em seu período habitual de março a abril.







Fonte

Até a próxima !!

Nenhum comentário:

Postar um comentário