Na semana passada, ao lançar os processadores AMD EPYC 9004″Genoa”, a AMD lançou o AOCC 4.0 como a versão mais recente de seu compilador C/C++ otimizador que agora suporta sua microarquitetura Zen 4. Na semana passada, executei alguns benchmarks iniciais do AOCC 4.0 e esse LLVM/Clang downstream parecia bastante favorável em relação ao upstream LLVM/Clang, enquanto, desde então, pude conduzir benchmarks mais completos em uma ampla variedade de C/C++ open-cargas de trabalho de origem. Aqui está uma rodada mais extensa de benchmarking AOCC 4.0 contra os compiladores LLVM/Clang e AOCC de código aberto.
Para a comparação de benchmarking AOCC 4.0 de hoje, os seguintes compiladores foram testados:
-AOCC 4.0 como a nova versão Znver4 do AMD Optimizing C/C++ Compilador e derivado do LLVM Clang 14 upstream.
-GCC 12.2 como a versão estável atual da GNU Compiler Collection. Não há trabalho específico do Zen 4 no GCC 12, mas obviamente o suporte AVX-512 e as outras instruções foram suportadas por anos pela GNU Compiler Collection.
-GCC 13.0.0 como o estado de desenvolvimento atual à frente de lançamento estável do GCC 13.1 do ano que vem. GCC 13 Git a partir desta semana foi usado. O GCC 13 conseguiu recentemente a habilitação inicial do Znver4, mas atualmente está usando as tabelas de custo/ajuste do Zen 3. Há mais trabalho do Znver4 pela frente, embora ainda não tenha sido concluído.
-LLVM Clang 14.0.6 disponível no Ubuntu 22.10.
-LLVM Clang 15.0.2 usando o repositório LLVM.org APT para a versão mais recente do compilador. O upstream LLVM/Clang, mesmo com 16 Git, ainda carece de patches de ativação do Znver4. A partir desta manhã, ainda não há patches”znver4″pendentes na fila de revisão do LLVM.
Com todos esses compiladores testados, os CFLAGS/CXXFLAGS foram mantidos iguais para direcionar o ISA nativo do processador, níveis de otimização-O3 e também permitindo otimizações de tempo de link (LTO) em nome de uma comparação de desempenho agressiva.
Devido ao meu único servidor AMD EPYC 9004″Genoa”no momento estar ocupado executando outros benchmarks, esta rodada de benchmarking Zen 4 AOCC foi feita usando um processador de desktop AMD Ryzen 9 7950X. A CPU de desktop Zen 4 de 16 núcleos estava executando o Ubuntu 22.10 com uma compilação de kernel Linux 6.1 Git.
Com o exigente LeelaChessZero, que é um mecanismo de xadrez que utiliza redes neurais, os back-ends Eigen e BLAS estavam aparecendo o desempenho mais rápido quando construído sob AOCC 4.0. (O GCC 13 falhou ao compilar este teste devido ao aumento de avisos/erros.) O desempenho upstream LLVM/Clang parecia bom para LC0 em relação ao GCC, mas os números do AOCC 4.0 mostram que pode haver benefícios reais do ajuste do Znver4 pela AMD.
Para outros testes como o CLOMP na medição da eficiência do OpenMP, também mostramos os melhores resultados quando construídos sob AOCC 4.0 para este desktop Ryzen 9 7950X.
Claro, para muitos programas C/C++ por aí, o compilador não faz muita diferença no desempenho resultante… Anos atrás, quando o Clang ainda estava tentando alcançar o GCC, a cena de benchmark do compilador era muito mais animada, enquanto hoje em dia o Clang provou consistentemente que pode gerar frequentemente em código menos comparável ao GCC, enquanto muitas vezes agora lidera a corrida.
LLVM/Clang e AOCC 4.0 foram mais rápidos que GCC 12.2 nos benchmarks de criptografia Crypto++. Crypto++ 8.2 falhou ao construir com GCC 13 devido ao aumento de avisos/erros do compilador.
Simdjson é um analisador JSON de alto desempenho que pode fazer uso de AVX-512 em CPUs capazes, como com Zen 4. Para alguns dos benchmarks simdjson, o compilador AOCC 4.0 estava gerando um aumento mensurável no desempenho, mas em outros cenários de teste o desempenho era comparável ao LLVM Clang 14 upstream.
Claro, geralmente compensa fornecer as cargas de trabalho da maioria importância para você ou sua empresa, pois os benefícios do compilador podem variar.
A codificação de imagem JPEG XL mostrava alguns bons aumentos de velocidade usando LLVM Clang 15 upstream. Esperançosamente, a próxima versão do AOCC (4.1) será rebaseada de LLVM 14 para LLVM 15.
No que diz respeito à decodificação de imagens JPEG-XL, o AOCC 4.0 disparou na frente dos outros compiladores.
Com codificação de imagem WebP, foi uma corrida muito mais acirrada.
Operações de imagem com thread OpenMP foram misturadas com GraphicsMagick para qual compilador teve o melhor desempenho.
Vídeo H.265 a codificação com Kvazaar teve o melhor desempenho quando construída no compilador AOCC 4.0 da AMD.
Enquanto isso, a codificação de vídeo com os codificadores SVT-AV1 e SVT-HEVC da Intel não apresentou muita diferença em relação aos compiladores testados.
O Coremark foi um dos raros testes em que o binário construído AOCC 4.0 ficou em último lugar.
Houve também uma surpreendente regressão de desempenho com o C-Ray construído sob AOCC 4.0.
>
O AOCC 4.0 estava produzindo o binário mais rápido para a codificação de imagens AVIF.
A biblioteca de rede neural oneDNN construída pelo AOCC frequentemente saía na frente, mas por margens muito estreitas.
AOCC 4.0 estava mostrando algum ni ce ganhos de desempenho com o software de processamento de sinal digital (DSP) de código aberto Liquid-DSP.
A compactação de textura ASTC foi um pouco mais rápida com AOCC 4.0 e, em geral, os compiladores LLVM/Clang estavam gerando um desempenho mensuravelmente melhor do que o GCC.
O software de rede neural NCNN estava desfrutando de desempenho mais rápido quando construído pelo AOCC 4.0.
O software de rede neural TNN da Tencent também estava coletando alguns ganhos de desempenho com o binário construído AOCC 4.0.
>
Eu realizei uma grande variedade de benchmarks C/C++ construídos sob esses cinco compiladores diferentes. Veja todos os meus resultados de benchmark na íntegra esta página de resultados.
De 190 testes realizados, o AMD Optimizing C/C++ Compiler foi o favorito em cerca de 55% das vezes. No resto do tempo, foi uma divisão quase uniforme entre os outros compiladores/versões LLVM/Clang e GCC testados.
Os binários construídos AOCC 4.0 foram os mais lentos apenas 9,5% do tempo, enquanto o GCC 12.2 teve o a maioria dos últimos lugares termina em 40%.
Se tomar a média geométrica para o subconjunto de benchmarks que foram executados com sucesso em todos os compiladores testados, o AOCC 4.0 foi a exceção por seu desempenho ser mensuravelmente diferente do resto. No geral, o AOCC 4.0 estava gerando um desempenho cerca de 4% melhor do que a versão estável atual do GCC 12. Obviamente, será interessante ver como esses números se comparam, uma vez que o upstream do GCC e do LLVM/Clang tenham otimizado o suporte e o ajuste do Zen 4. De qualquer forma, o AOCC 4.0 mostra o potencial e o benefício das otimizações do compilador e, para fornecedores e desenvolvedores de software, certamente pode compensar avaliar o desempenho de compiladores alternativos. Esta rodada de benchmarking foi com um AMD Ryzen 9 7950X enquanto, conforme o tempo do sistema permitir, também realizará ainda mais benchmarks de compilador em um servidor AMD EPYC”Genoa”de alta contagem de núcleos.