GCC vs. Clang/LLVM: An In-Depth Comparison of C/C++ Compilers

Visual C++, GNU Compiler Collection (GCC), and Clang/Low Level Virtual Machine (LLVM) are three mainstream C/C++ compilers in the industry. Visual C++ fornece interfaces gráficas de usuário (GUIs) e é fácil de depurar, mas não é adequado para plataformas Linux. Por conseguinte, este documento compara principalmente o GCC com o Clang/LLVM.

GCC é um compilador de linguagem de programa desenvolvido pela GNU. É um conjunto de software livre lançado sob a GNU General Public License (GPL) e GNU Lesser General Public License (LGPL). É um compilador oficial para os sistemas GNU e Linux, e um compilador principal para compilar e criar outros sistemas operacionais UNIX.

LLVM contém uma série de componentes modularizados do compilador e cadeias de ferramentas. Ele pode otimizar linguagens de programa e links durante a compilação, tempo de execução e tempo ocioso e gerar código. LLVM pode servir como um fundo para compiladores em várias línguas. Clang é um compilador C, C++, Objective-C, ou Objective-C++ que é compilado em C++ baseado em LLVM e lançado sob a Licença Apache 2.0. Clang é usado principalmente para fornecer desempenho superior ao do GCC.

através do desenvolvimento a longo prazo e iteração, GCC, Clang, e LLVM tornaram-se Compiladores maduros na indústria. Então, qual compilador é melhor? Qual devemos usar para compilar e construir programas e sistemas?

Significance of a Good Compiler

modern processors all have superscalar and long pipelines, and complex internal structures, and they support vector extension units in the Complex Instruction Set Computer (CISC) or Reduced Instruction Set Computer (RISC) architecture. Para muitos programas que contêm kernels intensivos em computação geral, os programadores podem usar comandos de extensão vetorial para melhorar o desempenho de execução do programa. Por exemplo, em operações de matriz e Vetor, os comandos de multiplicação e adição combinados são usados para melhorar o desempenho e a precisão. Comandos de Bit mask são usados para processamento de ramificações em operações vetoriais. No entanto, para alcançar o maior desempenho, programadores e compiladores ainda precisam gastar muito esforço para lidar com tarefas com modos complexos de acesso à memória e kernels não-padrão.

adicionalmente, os padrões das linguagens modernas avançadas abstratam constantemente os detalhes de hardware e estruturas de dados subjacentes para gerar código geral que é mais lógico e matemático, em vez de instruções de operação específicas e caminhos de acesso à memória. Os padrões C++ são cada vez mais expressivos e abstratos. Python é popular porque é mais legível e expressivo, mesmo ao custo de uma menor velocidade de execução. Maior expressividade aumenta o fardo do compilador para gerar um bom código de montagem a partir das estruturas complexas compiladas pelos programadores. O compilador deve ser mais inteligente e trabalhar mais para maximizar o desempenho usando o código. Nem todos os compiladores podem fazer isso. Ao selecionar um compilador, devemos primeiro considerar se o mesmo segmento de código pode gerar comandos de montagem mais eficientes.

além de gerar programas executáveis de alto desempenho, compiladores modernos também devem ter alto desempenho. Um projeto de software de grande porte em C++ pode conter centenas a milhares de unidades de tradução individuais. Cada unidade de tradução pode conter milhares de linhas de código. O código C++ também pode usar um grande número de tecnologias de programação baseadas em template. Estas tecnologias exigem que o compilador transfira informações relevantes várias vezes para gerar um arquivo alvo. A compilação de grandes projetos de C++ pode levar várias horas, e várias mudanças mutuamente dependentes devem ser submetidas simultaneamente durante o desenvolvimento. Cada submissão requer que os desenvolvedores recompile a maioria das bibliotecas de código. Portanto, compiladores mais rápidos (ferramentas de construção) são fundamentais para alcançar alta produtividade para grandes equipes.

em termos de extensão da linguagem, sistemas de computação modernos com múltiplos kernels, capacidades de processamento vetorial e aceleradores fornecem capacidades superiores às capacidades naturais de linguagens de programação comuns. Portanto, frameworks específicos de computação de alto desempenho (HPC), como OpenMP e OpenACC, podem preencher esta lacuna. Estes frameworks fornecem interfaces de programas de Aplicação (APIs) que os programadores podem usar para expressar paralelismo em código. O compilador e a biblioteca de tempo de execução correspondente devem mapear o código paralelo para a arquitetura do processador. Muitos projetos HPC dependem de padrões OpenMP e OpenACC, que estão sendo estendidos por desenvolvedores e fabricantes de hardware. Portanto, os compiladores devem acompanhar o desenvolvimento de padrões de extensão de linguagem.

Em conclusão, um bom compilador nos permite focar no processo de programação, ao invés de lutar contra suas deficiências. Ele pode suportar os mais recentes padrões de linguagem, gerar comandos otimizados a partir do código mais abstrato, e compilar o código fonte em menos tempo.

história de desenvolvimento do GCC

Antes de aprender o GCC, você precisa primeiro entender o Projeto GNU. Richard Stallman lançou o projeto GNU em 1984 para construir um sistema de software de código aberto semelhante ao UNIX. O sistema operacional GNU não evoluiu extensivamente ao longo do tempo. No entanto, ele incubou muitas ferramentas de software de código aberto excelentes e úteis, como Make, Sed, Emacs, Glibc, GDB, e GCC também. Estes softwares GNU de código aberto e kernels Linux juntos constituem o sistema GNU / Linux. No início, o GCC forneceu Compiladores estáveis e confiáveis, baseados na linguagem de programação C, para o sistema GNU. Seu nome completo é GNU C Compiler. Mais tarde, mais linguagens (como Fortran, Obj-C e Ada) foram suportadas, e o nome completo do GCC mudou para GNU Compiler Collection.

GCC-1.0 foi lançado por Richard Stallman em 1987, mais de trinta anos atrás. Do ponto de vista do software é muito antigo. Someone collected the GCC development records from between 1989 and 2012, and produced a thirty-minute animated video (GNU Compiler Collection dev history 1989-2012), intuitively demonstrating the development process of GCC. Podemos aprender sobre a história de desenvolvimento do GCC a partir de suas versões:

  • GCC-1.0: lançado por Richard Stallman em 1987.
  • GCC-2.0: lançado em 1992 e suportado C++. Mais tarde, a comunidade do GCC foi dividida porque Richard Stallman definiu o GCC como um compilador C confiável do sistema GNU e pensou que o GCC na época era suficiente para o sistema GNU e o foco de desenvolvimento deveria ser transferido do GCC para o próprio sistema GNU. Outros grandes desenvolvedores esperavam continuar a melhorar o GCC e fazer desenvolvimentos e melhorias mais radicais em vários aspectos. Estes desenvolvedores ativos deixaram a comunidade do GCC em 1997 e desenvolveram o garfo do AECT.
  • GCC-3.0: obviamente, os desenvolvedores geralmente tinham um forte desejo por bons Compiladores. O garfo EGCS desenvolveu-se sem problemas e tornou-se reconhecido por cada vez mais Desenvolvedores. Eventualmente, o EGCS foi usado como a nova espinha dorsal do GCC e o GCC-3.0 foi lançado em 2001. A comunidade dividida foi re-fundida novamente, mas a influência de Richard Stallman tinha sido enfraquecida em certa medida. Além disso, o Comitê Industrial do CCG havia começado a decidir a direção de desenvolvimento do CCG.
  • GCC-4.0: lançado em 2005. Esta versão foi integrada na árvore Serial Storage Architecture (SSA), e GCC evoluiu para ser um compilador moderno.
  • GCC-5.0: lançado em 2015. Mais tarde, a Política de versões GCC foi ajustada e uma versão principal foi lançada a cada ano. Um benefício inesperado é que o número da versão corresponde ao ano. Por exemplo, o GCC-7 foi lançado em 2017, e o GCC-9 foi lançado em 2019.

Agora, o desenvolvimento do GCC entrou na”crônica moderna”. Enfrentando a pressão competitiva da LLVM, a comunidade do CCG fez ativamente muitos ajustes, tais como acelerar a compilação e melhorar a informação de aviso de compilação. Nos últimos 30 anos, o GCC evoluiu de um challenger na indústria de compiladores para um compilador mainstream para sistemas Linux, e agora enfrenta o desafio da LLVM. Felizmente, a comunidade do CCG está a fazer ajustamentos para acelerar o desenvolvimento do CCG. Podemos esperar que a competição entre as duas tecnologias de compilação continuará a fornecer desenvolvedores de software com melhores Compiladores.

história de desenvolvimento de Clang e LLVM

LLVM foi originada a partir da pesquisa de Chris Lattner na UUIC em 2000. Chris Lattner queria criar uma tecnologia de compilação dinâmica para todas as linguagens estáticas e dinâmicas. LLVM é um tipo de software de código aberto desenvolvido sob a licença BSD. A versão inicial 1.0 foi lançada em 2003. Em 2005, Apple Inc. contratou Chris Lattner e sua equipe para desenvolver linguagens de programação e compiladores para computadores da Apple, após o que o desenvolvimento da LLVM entrou na faixa rápida. A partir do LLVM 2.5, duas versões menores do LLVM foram lançadas todos os anos (geralmente em março e setembro). Em novembro de 2011, LLVM 3.0 foi lançado para se tornar o compilador Xcode padrão. XCode 5 começou a usar Clang e LLVM 5.0 por padrão. A Política de versões foi ajustada para o LLVM 5.0 e versões posteriores, e duas versões principais são lançadas a cada ano. A versão estável atual é 8.0.

O nome do LLVM foi abreviado pela primeira vez a partir de uma máquina Virtual de baixo nível. Como este projecto não se limita à criação de uma máquina virtual, a abreviatura LLVM é frequentemente questionada. Após o desenvolvimento do LLVM, tornou-se um termo coletivo para muitas ferramentas de compilação e tecnologias de ferramentas de baixo nível, tornando o nome menos apropriado. Os desenvolvedores decidiram abandonar o significado por trás desta abreviação. Agora LLVM tornou-se o nome oficial da marca, aplicável a todos os projetos da LLVM, incluindo LLVM Intermediate Representation (LLVM IR), LLVM debugging tools, e LLVM C++ standard libraries. LLVM pode ser usado como um compilador tradicional, compilador JIT, montador, depurador, ferramenta de análise estática, e para outras funções relacionadas com linguagens de programação.

em 2012, LLVM ganhou o “software system award of Association for Computing Machinery” (ACM), juntamente com sistemas tradicionais como UNIX, WWW, TCP/IP, Tex e Java. O LLVM simplifica muito a implementação de novas cadeias de ferramentas de linguagem de programação. Nos últimos anos, muitas novas linguagens de programação, como Swift, Rust e Julia, têm usado LLVM como seu framework de compilação. Além disso, LLVM tornou-se o compilador padrão para os sistemas Mac OS X, iOS, FreeBSD e Android.

Clang

Clang é projetado para fornecer um compilador frontend que pode substituir o GCC. Apple Inc. (including NeXT later) has been using GCC as the official compiler. O GCC sempre funcionou bem como um compilador padrão na comunidade de código aberto. No Entanto, Apple Inc. tem seus próprios requisitos para Ferramentas de compilação. Por um lado, a Apple Inc. adicionou muitos novos recursos para a linguagem Objective-C (ou mesmo, mais tarde, a linguagem C). No entanto, os desenvolvedores do GCC não aceitaram esses recursos e atribuíram baixa prioridade ao suporte para esses recursos. Mais tarde, eles foram simplesmente divididos em dois ramos para desenvolvimento separado, e consequentemente a versão GCC lançado pela Apple Inc. é muito mais cedo do que a versão oficial. Por outro lado, o código GCC é altamente acoplado e difícil de ser desenvolvido separadamente. Além disso, em versões posteriores, a qualidade do código continua a diminuir. No entanto, muitas funções exigidas pela Apple Inc. (como o suporte a um ambiente de Desenvolvimento Integrado melhorado (IDE)) deve chamar o GCC como um módulo, mas o GCC nunca fornece esse suporte. Além disso, a Isenção de bibliotecas em tempo de execução do GCC limita fundamentalmente o desenvolvimento do GCC LLVM. Também limitada pela licença, Apple Inc. não é possível usar o LLVM para melhorar ainda mais a qualidade de geração de código com base no GCC. Portanto, Apple Inc. decidiu escrever o Clang frontend das linguagens C, C++ e Objective-C do zero para substituir completamente o GCC.

Como o nome sugere, Clang só suporta C, C++, e o desenvolvimento Objective-C. começou em 2007 e o compilador C foi concluído pela primeira vez. Clang for Objective-C cloud be fully used for the production environment in 2009. O suporte para C++ também progrediu rapidamente. Clang 3.3 totalmente suportado C++ 11, Clang 3.4 totalmente suportado C++ 14, e Clang 5 totalmente suportado C++ 17, e todos estavam significativamente à frente do GCC na época.tal como outras comunidades de software de código aberto, a comunidade do GCC é dominada por entusiastas de software livre e hackers. No processo de desenvolvimento, os mecanismos de gestão e participação da Comunidade do CCG são gradualmente formados hoje. Atualmente, a comunidade do CCG é uma sociedade de conhecimento relativamente estável e bem definida na qual cada pessoa tem papéis e deveres claros: Richard Stallman e Free Software Foundation (FSF): embora raramente envolvidos na gestão da Comunidade do CCG, Richard Stallman e FSF ainda estão separados em licença e assuntos legais.Comité Industrial CCG: Gerencia os Assuntos Comunitários do CCG, temas de desenvolvimento do CCG independentes em tecnologia, e a nomeação e anúncio de revisores e mantenedores. Atualmente tem 13 membros.mantenedores globais: dominam as actividades de desenvolvimento do CCG. Em certa medida, determinam a tendência de desenvolvimento do CCG. Atualmente, existem 13 mantenedores globais, que nem todos têm escritório no comitê Industrial do CCG.

  • Frontend, middle-end, and backend maintainers: They are the maintainers of frontend, backend, and other modules. Eles são responsáveis pelo código do módulo GCC correspondente, e muitos deles são os principais contribuintes para o código do módulo. Vale a pena notar que os revisores são geralmente classificados neste grupo. A diferença é que os revisores não podem aprovar seu próprio patch, enquanto os mantenedores podem submeter suas próprias modificações dentro de seu âmbito de responsabilidade sem a aprovação dos revisores.contribuidores
  • : eles são os grupos de desenvolvimento mais extensos na comunidade do CCG. Depois de assinar o Acordo de direitos autorais, qualquer desenvolvedor pode solicitar a permissão de escrita após aprovação da comunidade, e então enviar o código por si mesmo.tal como outras comunidades de código aberto, a comunidade madura do GCC já não é dominada por hackers. As empresas comerciais começaram a desempenhar papéis importantes na comunidade, tais como recrutar desenvolvedores e patrocinar reuniões de desenvolvimento. Atualmente, a comunidade do CCG é dominada pelos seguintes tipos de empresas comerciais:
    • vendedores de sistemas, principalmente incluindo RedHat e SUSE.
    • vendedores de chips, principalmente Intel, ARM, AMD e IBM (PowerPC).fornecedores especializados, tais como CodeSourcery e fornecedores de serviços de cadeia de ferramentas como AdaCore baseado na linguagem Ada. CodeSourcery teve uma história brilhante e recrutou muitos desenvolvedores famosos, mas recusou depois que foi adquirida pela Mentor.

    na comunidade atual do GCC, os vendedores de chips dominam o desenvolvimento de backend, enquanto os vendedores de sistemas guiam outras áreas de desenvolvimento. Em termos de desenvolvimento comunitário, o código GCC está atualmente hospedado em seu próprio servidor SVN. Uma API Git é fornecida para facilitar o desenvolvimento e submissão. A revisão de Patch é semelhante à da Comunidade do Kernel Linux e usa o formulário da lista de discussão. Como mencionado acima, a comunidade do CCG é uma sociedade de conhecimento relativamente estável (ou fechada). A comunidade tem basicamente 150 a 200 colaboradores ativos por ano e realiza uma conferência de desenvolvedores em setembro de cada ano. Em setembro de 2019, a conferência de desenvolvedores será realizada em Montreal, Canadá.

    LLVM Community

    The LLVM community is a noob-friendly compiler community. Ele responde rapidamente às questões dos novos usuários e comentários de patch. Esta é também a base e a fonte para discussões subsequentes da Fundação LLVM e a adoção do código de Conduta comunitário LLVM, e causa uma série de discussões politicamente corretas.

    Todos os projetos LLVM e problemas são discutidos através da lista de E-mail DevExpress, e envio de código é notificado através da lista de E-mail commits. Todos os bugs e modificações de recursos são rastreados através da lista de bugs. Os patches submetidos são recomendados para os ramos principais. O estilo está em conformidade com os padrões de codificação LLVM e revisão de código é realizada através do Phabricator. Atualmente, o repositório de código LLVM foi migrado para o GitHub.ao contrário da Comunidade do CCG, a comunidade LLVM só tem a fundação LLVM. A fundação LLVM tem oito membros. Para além de gerir os Assuntos Comunitários da LLVM, cada membro da Fundação LLVM tem de orientar as questões de desenvolvimento da LLVM relacionadas com a tecnologia. Atualmente, o presidente é Tanya Lattner, a esposa de Chris Lattner. O próprio Chris Lattner também é membro da fundação e tem um forte controle sobre a comunidade LLVM e a direção de desenvolvimento da LLVM.a Política de revisão do código na comunidade LLVM é basicamente a mesma da Comunidade do CCG. A diferença é que, devido ao rápido desenvolvimento do LLVM, muitos contribuintes não têm permissão de acesso commit, e têm que enviar seu código através dos mantenedores. Atualmente, as comunidades Clang e LLVM têm mais de 1.000 colaboradores a cada ano. Geralmente, conferências de desenvolvedores são realizadas em abril e outubro anualmente. A conferência de desenvolvedores em outubro de 2019, será realizada em San Jose, EUA.

    A Licença LLVM é alterada da licença UIUC para a Licença Apache 2.0 com exceções LLVM. É usado principalmente para resolver o problema de que a biblioteca de runtime LLVM é baseada na licença MIT e a autorização de patente necessária para o projeto é muito extensa. Ao abrigo desta licença, a LLVM permite a qualquer pessoa derivar produtos comerciais da LLVM sem quaisquer restrições, e não exige que quaisquer derivados forneçam código de código aberto, promovendo assim o uso extensivo da LLVM, incluindo:

    1. o descarregamento ou a utilização do LLVM, no todo ou em parte, para fins pessoais, internos ou comerciais. A capacidade de modificar o código LLVM sem contribuir de volta para o projeto.
    2. a criação de um pacote ou versão de lançamento contendo LLVM. A associação do LLVM com código autorizado por todas as outras licenças de código aberto (incluindo BSD, MIT, GPLv2 e GPLv3).ao distribuir novamente o LLVM, você deve manter o aviso de direitos autorais. Não pode apagar ou substituir o cabeçalho dos direitos de Autor. O ficheiro binário que contém o LLVM deve conter o aviso de copyright.

    Comparação de Desempenho entre o GCC e o LLVM

    Arquitetura x86_64
    Processador: Intel (R) Xeon (R) Platina 8163 CPU @ 2.50 GHz
    cache de dados L1: 32 KB
    cache L2: 1.024 KB
    cache L3: 33,792 KB
    Memória: 800 GB
    sistema Operacional: Alibaba Grupo Enterprise Linux Server release 7.2 (Paladino)
    Kernel: 4.9.151–015.ali3000.alios7.compilador x86_64: Clang / LLVM 8.0 GCCC8.3. 1

    Benchmark

    SPEC CPU 2017 é um conjunto de ferramentas de teste do subsistema CPU para testar a CPU, cache, memória e compilador. Contém 43 testes de quatro categorias, incluindo Specpeed 2017 INT e FP que testam a velocidade de operação de ponta flutuante e SPECrate 2017 INT e FP que testam a taxa de concorrência de inteiros e a taxa de concorrência de vírgula flutuante. Clang não suporta a língua Fortran. Portanto, neste exemplo, os programas C / C ++ no conjunto de testes de Velocidade SPEC são usados para testar a diferença de desempenho do núcleo único entre os programas binários gerados por Clang e GCC. A tabela seguinte lista os conjuntos SPEC CPU2017 C E C++:

    CINT2017 SpeedCFP2017 Speed600.perlbench_s619.lbm_s602.gccc_s644.nab_s605.mcf_s620.omnetppp_s623.xalancbmk_s625.x264_s631.deepsjeng_s641.leela_s657.xz_s

    Métodos de ensaio

    o quadro de automatização LLVM-lnt é utilizado para realizar o ensaio e comparar o desempenho. Funciona da mesma forma que o runcpu da SPEC CPU. Antes de LLVM-lnt correr, cache (eco 3 > /proc/sys/vm/drop_ caches) é limpa e então o conjunto de dados de teste é executado. A seguir, o conjunto de dados da ref é executado três vezes. Utiliza-se como resultado final o valor médio dos três resultados do ensaio de referência. Para reduzir as flutuações de desempenho causadas pela migração de CPU ou pelo interruptor de contexto, os processos que rodam no conjunto de dados de ensaio e no conjunto de dados de ref estão ligados a um núcleo de CPU utilizando a ferramenta de afinidade de CPU. Para o teste de tempo de compilação, este método usa o thread 1 para construir o programa de teste e comparar os itens de teste que foram compilados por um longo tempo. O tempo de compilação não inclui o tempo de execução do linker. Ele só inclui o tempo em que todos os arquivos de origem em todos os programas de teste são gerados.

    comparação do desempenho da compilação

    o processo de compilação do CCG é o seguinte:: ler o ficheiro de código, pré-processar o ficheiro de código, convertê-lo em IR, optimizar e gerar um ficheiro de montagem. Em seguida, o montador gera um arquivo objeto. Clang e LLVM não dependem de compiladores independentes, mas integram Compiladores auto-implementados na infra-estrutura. O processo de gerar arquivos de montagem é omitido no processo de gerar arquivos de objetos. O arquivo do objeto é gerado diretamente a partir do IR. Além disso, em comparação com o GCC IR, a estrutura de dados do LLVM IR é mais concisa. Ele ocupa menos memória durante a compilação e suporta a travessia mais rápida. Portanto, Clang e LLVM são vantajosos em termos de tempo de compilação, o que é comprovado pelos dados obtidos a partir da compilação SPEC, como mostrado na figura abaixo. Clang reduz o tempo de compilação de linha única em 5% a 10% em comparação com o GCC. Portanto, Clang oferece mais vantagens para a construção de grandes projetos.

    a Comparação de ESPECIFICAÇÃO de tempo de compilação

    Comparação do Desempenho da Execução

    a Maioria das cargas de trabalho em nuvem requerem que os aplicativos podem ser executados em clusters diferentes. Ao criar estas aplicações, não especifique parâmetros relacionados com a máquina. Para se adaptar à rápida iteração causada por mudanças de demanda, cargas de trabalho fora do local também devem ser debuggable. Portanto, além de algumas bibliotecas estáveis e comuns que permitem altos níveis de otimização de compilação, a carga de trabalho em si tem um baixo nível de compilação e otimização (O2 ou abaixo). Para atender a este requisito, este documento compara o desempenho de diferentes compiladores nos níveis de otimização O2 e O3 para programas de velocidade INT, como mostrado na figura a seguir:

    comparação de Desempenho da ESPECIFICAÇÃO CPU2017 INT Velocidade

    O GCC tem 1% para 4% o desempenho de vantagem sobre o Barulho e o LLVM para a maioria dos programas de O2 e O3 níveis, e, em média, tem uma área de cerca de 3% de vantagem de desempenho para SPEC CPU2017 INT Velocidade. Em termos de 600.perlbench_s e 602.gcc_s/O2, o GCC tem uma grande vantagem de desempenho (mais de 10%). Estes dois itens de teste não têm hotspots pendentes e podem refletir o efeito de otimização abrangente do compilador. Os resultados do teste mostram que o GCC é sempre vantajoso em otimização de desempenho. No entanto, para dois programas relacionados com a IA, incluindo 631.deepsjeng_s e 641.leela_s, que são recentemente adicionados ao teste SPEC, Clang e LLVM melhoram o desempenho em mais de 3% em comparação com o GCC. Isto também reflete o rápido progresso da LLVM em termos de otimização. Para o 625. x264_s O2 optimization, LLVM melhora o desempenho em 40% porque o hotspot do caso está de acordo com as regras vectorizadas. Mas Clang e LLVM otimizam os vetores no nível O2, enquanto GCC otimiza os vetores no nível O3. Exceto para programas vetorizados, o GCC não melhora muito o desempenho no nível O3 em comparação com o nível O2. Em outras palavras, os programas não são sensíveis à otimização do GCC O3. Em contraste, Clang e LLVM melhoram significativamente o desempenho de alguns programas (como 600. perlbench_s e 602. gcc_s) ao nível O3.os programas HPC, como a velocidade FP, geralmente são executados em servidores de alta gama. Eles têm algoritmos de núcleo estáveis, altos requisitos para vetorização relacionada ao desempenho e paralelismo, e permitem altos níveis de otimização (O3 ou acima). Portanto, este documento compara o desempenho no nível de otimização O3 + march = nativo (skylake-avx512), como mostrado abaixo:

    comparação de Desempenho de SPEC CPU2017 FP Velocidade

    Para os dois FP programas, o GCC também pode melhorar o desempenho em cerca de 3%. Clang e LLVM são otimização conservadora em loop e, portanto, não são vantajosas no desempenho. No entanto, o sub-projeto Polly de Clang e LLVM fornece um loop de alto nível e otimizador de localização de dados que tem sido amplamente aplicado na aprendizagem de máquinas, computação de alto desempenho, e otimização de computação heterogênea. Acredito que a Polly pode melhorar muito o desempenho de programas que contêm circuitos hotspot conformes com as regras de Vectorização e paralelismo. Também vou analisar o desempenho da Polly numa série de benchmarks e cargas de trabalho.a partir dos testes de benchmarking acima, podemos ver que Clang oferece mais vantagens para a construção de grandes projetos, enquanto o GCC é sempre vantajoso em otimização de desempenho. O bla depende de sua aplicação específica

    além de comparação de desempenho, eu gostaria de compartilhar as vantagens e desvantagens do GCC e o Bumbum e o LLVM:

    > Vantagens do GCC

    • GCC suporta mais tradicionais de língua, que não o Barulho e o LLVM, como Ada, Fortran, e Ir.
    • GCC suporta arquiteturas menos populares, e suportou RISC-V mais cedo do que Clang e LLVM.
    • GCC suporta mais extensões de linguagem e mais características de linguagem de montagem do que Clang e LLVM. O GCC ainda é a única opção para compilar o kernel Linux. Embora a pesquisa sobre a compilação de kernel usando Clang e LLVM também é relatada na indústria, o kernel não pode ser compilado sem modificar o código fonte e parâmetros de compilação.

    vantagens de Clang e LLVM

    • as línguas emergentes estão usando os frameworks LLVM, tais como Swift, Rust, Julia e Ruby.
    • Clang and LLVM comply with the C and C ++ standards more strictly than GCC. GNU Inline e outros problemas durante a atualização do GCC não ocorrem.
    • Clang também suporta algumas extensões, como atributos para verificação de segurança thread.
    • Clang provides additional useful tools, such as scan-build and clang static analyzer for static analysis, clang-format and clang-tidy for syntax analysis, as well as the editor plug-in Clangd.
    • Clang fornece informações diagnósticas mais precisas e amigáveis, e destaca mensagens de erro, linhas de erro, dicas de linha de erro, e sugestões de reparo. Clang considera a informação de diagnóstico como uma característica. A informação de diagnóstico começou a ser melhorada apenas a partir do GCC 5.0, e tornou-se maduro no GCC 8.

    (artigo original de Ma Jun马骏)

  • Deixe uma resposta

    O seu endereço de email não será publicado. Campos obrigatórios marcados com *