O engenheiro do Google, Eric Biggers, continua sua série de otimizações de desempenho no kernel Linux com uma nova contribuição significativa focada na melhoria da performance do CRC32C em processadores x86/x86_64. Esta otimização visa eliminar o código Assembly excessivamente desenrolado e a tabela de salto, resultando em um código mais enxuto e eficiente, especialmente para CPUs modernas da Intel e AMD.
Melhorias no CRC32C e simplificação do código
O patch de Biggers propõe uma reescrita do código Assembly utilizado no CRC32C para processadores Intel e AMD, removendo o desenrolamento excessivo de loops e a utilização de uma tabela de salto, que aumentava o tamanho do binário e introduzia uma chamada indireta. Segundo Biggers, as CPUs x86_64 são suficientemente capazes de prever loops, o que torna a utilização de um loop simples mais eficiente do que a estratégia anterior.
A mudança reduz o tamanho do código binário da função crc_pclmul()
de 4546 bytes para 418 bytes, uma redução de 91% no tamanho do código. Além disso, com o Retpoline habilitado — configuração padrão para a maioria dos sistemas Intel e AMD —, o novo código resulta em um aumento expressivo de throughput.
Impacto de desempenho nas CPUs Intel e AMD
Os benchmarks fornecidos por Biggers no patch mostram ganhos de desempenho notáveis em diversas arquiteturas de CPU. No caso dos processadores Intel Emerald Rapids, por exemplo, houve um aumento de até 66% no throughput para blocos de dados de 512 bytes, enquanto os processadores AMD Zen 2 apresentaram uma melhoria de até 29,5%. As melhorias são menos acentuadas em blocos de dados maiores, mas ainda assim representam uma otimização significativa para cenários de criptografia no kernel Linux.
Os resultados com o Retpoline desativado são menos impactantes, mas ainda demonstram melhorias modestas em todas as arquiteturas testadas, com a AMD Zen 2 apresentando um ganho de até 11,8% para blocos de 512 bytes.
Próximos passos para o kernel Linux 6.13
Essa otimização está programada para ser incluída no ciclo de desenvolvimento do Linux 6.13, o que deve beneficiar não apenas servidores e data centers que dependem de criptografia de alto desempenho, mas também qualquer sistema moderno que utilize o CRC32C para verificação de integridade e outras tarefas relacionadas.
A inclusão dessas mudanças no kernel Linux destaca o compromisso da comunidade open-source em manter o kernel otimizado e eficiente, especialmente para as arquiteturas mais recentes da Intel e AMD. A expectativa é que essa atualização faça parte da versão final do Linux 6.13, prevista para fevereiro de 2025.