Os compiladores Intel são realmente melhores que os da Microsoft? [fechadas]

56

Anos atrás, fiquei surpreso ao descobrir que a Intel vende compiladores compatíveis com o Visual Studio. Eu tentei em particular para C / C ++, bem como ferramentas de diagnóstico fantásticas. Mas o código simplesmente não era tão computacionalmente intenso para perceber a diferença. A única impressão foi: a Intel realmente fez isso por mim agora? Uau, ferramentas incríveis com resolução de nanossegundos, inacreditável. Mas o julgamento terminou e a equipe nunca considerou seriamente uma compra.

Pela sua experiência, se o custo da licença não importa, qual fornecedor é o vencedor?

Não é uma pergunta ampla ou vaga, nem uma tentativa de desencadear uma guerra santa. Esse tipo de pergunta é sobre duas ferramentas muito visíveis. Ninguém gosta quando as ferramentas têm mistérios ou surpresas. E as escolhas entre o melhor e o melhor são sempre a dor. Eu também entendo que a grama é sempre um argumento mais verde . Eu quero ouvir todas as histórias "e se".

E se a Intel o otimizar localmente para a etapa de chips do mês, e nem todo destino de hardware funcione tão bem quanto a Microsoft compilado? E se o hardware da AMD for o alvo e tudo desacelerar sem motivo? Ou, por outro lado, e se o hardware da Intel tiver tantas oportunidades imperceptíveis, que os escritores de compiladores da Microsoft são muito lentos para adotar e nunca o implementam no compilador? E se os dois forem exatamente iguais, na verdade, uma única base de código agrupada em duas caixas diferentes e licenciada a ambos os fornecedores por alguma loja de terceiros?

E assim por diante. Mas alguém sabe algumas respostas.

Peter Mortensen
fonte
17
Os compiladores Intel têm uma reputação de produzir código numérico muito eficiente.
4_11
2
@honk: Se quant_dev pode fornecer alguns links para fazer backup, então sim deveria ser!
FrustratedWithFormsDesigner
2
@RocketSurgeon: Nem todo mundo concorda com sua declaração. Na verdade, Eric Raymond defende que a Microsoft reteve o progresso da computação por algumas décadas com suas práticas de negócios.
Mason Wheeler
2
O código-fonte aberto @RocketSurgeon não tem nada a ver com dinheiro.
kaoD
11
O compilador da Microsoft gera um código muito bom. A inspeção manual da montagem raramente encontra seqüências de instruções idiotas. Na verdade, fiquei impressionado com a profundidade das otimizações, e até impede que as instruções ultrapassem os limites da linha de cache.
Doug65536

Respostas:

57

AVISO: Resposta baseada na própria experiência - YMMV

Se o código é realmente caro computacionalmente, sim, definitivamente . Vi uma melhoria de mais de 20 vezes com o antigo Intel C ++ Compiler (agora Intel Studio, se bem me lembro) em relação ao Microsoft Visual C ++ Compiler padrão. É verdade que o código estava longe de ser perfeito e isso pode ter desempenhado um papel (na verdade, foi por isso que nos preocupamos em usar o compilador Intel, era mais fácil do que refatorar a gigante base de código), também a CPU usada para executar o código era um Intel Core 2 Quad, que é o CPU perfeito para isso, mas os resultados foram chocantes. O próprio compilador contém inúmeras maneiras de otimizar o código, incluindo o direcionamento de uma CPU específica em termos de, por exemplo, recursos SSE . Realmente deixa -O2/ -O3envergonha-se. E isso foiantes de usar o criador de perfil.

Observe que, no entanto, ativar otimizações realmente agressivas fará com que a compilação leve algum tempo, duas horas para um projeto grande não são impossíveis. Além disso, com altos níveis de otimizações, há uma chance maior de um erro no código se manifestar (isso também pode ser observado no gcc -O3). Para um projeto que você conhece bem, isso pode ser uma vantagem, já que você encontrará e corrigirá eventuais erros que não detectou anteriormente, mas ao compilar uma bagunça peluda, basta cruzar os dedos e orar aos deuses x86.

Algo sobre desempenho em máquinas AMD: não é tão bom quanto os processadores Intel, mas ainda é muito melhor do que o compilador MS C ++ (novamente, pela minha experiência). O motivo é que você também pode direcionar uma CPU genérica com suporte a SSE2 (por exemplo). Os processadores AMD com SSE2 não serão muito discriminados. O compilador Intel na CPU Intel realmente rouba a cena. No entanto, nem tudo são arco-íris duplos e unicórnios brilhantes. Houve algumas acusações pesadas sobre binários que não estão sendo executados em CPUs não-GenuineIntel e (este é admitido) induziu artificialmente um desempenho inferior nas CPUs por outros fornecedores. Observe também que são informações de pelo menos três anos atrás e sua validade a partir de agora é desconhecida, mas as novas descrições de produtos oferecem aos binários uma carta branca para que funcionem tão lentamente quanto a Intel considerar adequado em CPUs que não sejam da Intel.

Não sei o que é a Intel e por que elas são tão boas ferramentas de computação numérica, mas veja também: http://julialang.org/ . Há uma comparação e, se você olhar para a última linha, o MATLAB brilha ao derrotar o código C e a Julia , o que me impressiona é que os autores pensam que o motivo é a Biblioteca de Kernel de Matemática da Intel .

Percebo que isso soa muito como um anúncio para o kit de ferramentas do Intel Compiler, mas, na minha experiência, ele realmente fez o trabalho bem, e até a lógica simples determina que os caras que fazem CPUs devem saber melhor como programar para eles. Na IMO, o compilador Intel C ++ reduz todos os ganhos de desempenho possíveis.

K.Steff
fonte
@ K.Steff Você comparou esse compilador vs ms com o programa inteiro opt e a otimização guiada por perfil.
executar novamente
2
A Intel foi forçada a divulgar que seu compilador usa deliberadamente caminhos de código não otimizados em tempo de execução se a CPU não for fabricada pela Intel. A Intel teve problemas com o FTC . Você não poderia me pagar para usar o ICC. Eu não tocaria essa porcaria anticompetitiva com uma vara de três metros.
precisa saber é o seguinte
@ doug65536 A pergunta que se faz é "Os compiladores da Intel são realmente melhores", não "A Intel é um monopolista no mercado de hardware que abusa desse monopólio para ganhar mais terreno em software". Não estou dizendo que seu comentário é oftópico, mas para mim a ideologia não tem lugar nesta discussão. Use ou não - sua decisão, mas isso não mudará o fato de que o ICC é muito bom em produzir binários para CPUs Intel.
K.Steff
A linguagem C, que se tornou popular na década de 1990, estendeu a linguagem C de várias maneiras que permitiam aos programadores escrever código mais eficiente, mas que alguns compiladores otimizadores não suportam. Pelo que posso dizer, a Microsoft ficou menos ansiosa do que outros fornecedores em buscar otimizações que seriam incompatíveis com essas extensões. Isso torna seus compiladores menos eficientes do que aqueles que não se importam com essa compatibilidade ao processar códigos que não os exigem, mas permitem que processe corretamente o código que os exige.
supercat
35

O Intel Compiler tem a reputação de produzir código numérico muito eficiente:

https://stackoverflow.com/questions/1733627/anyone-here-has-benchmarked-intel-c-compiler-and-gcc

http://www.open-mag.com/754088105111.htm

http://www.freewebs.com/godaves/javabench_revisited/

Observe que não afirmo que seja o compilador mais rápido do mercado, mas certamente goza de uma reputação muito boa de eficiência. Observe que os autores dos binários "oficiais" do LAPACK para Windows usam o compilador Intel Fortran para construí-los: http://icl.cs.utk.edu/lapack-for-windows/ e devem saber um ou dois aspectos sobre eficiência.

quant_dev
fonte
2
Não só tem essa reputação, ela faz jus a ela. Não é necessário se você o estiver usando para escrever aplicativos CRUD, mas os produtos C, C ++ e FORTRAN são absolutamente cruéis quando se trata de trituração de números.
Blrfl
27

O Intel C ++ possui algumas vantagens sobre o gcc, além do gerador de código. Ambas derivam (em grande parte) do fato de serem baseadas no front-end do EDG . Para melhor ou pior, ambos estão (lentamente) corroendo, portanto as vantagens não são tão grandes quanto eram antes.

A primeira é que, em regra, emite mensagens de erro muito melhores. Você pode querer comparar as mensagens de erro entre Clang e gcc. O Intel C ++ (junto com a maioria dos outros baseados no front-end do EDG) emite diagnósticos semelhantes aos do Clang há anos.

Segundo, é que o front end EDG é tão conhecido por sua excepcional conformidade com a linguagem quanto o gerador de código Intel é para produzir código rápido. Por quase qualquer medida razoável, o front-end do EDG fornece melhor conformidade com C ++ 98, 03 ou (nas versões atuais) C ++ 0x do que qualquer outro compilador disponível.

Como eu disse, essas duas vantagens foram corroídas em vários graus ao longo do tempo. As versões recentes do gcc têm uma conformidade de idioma bastante decente. O Clang possui mensagens de erro substancialmente melhores e está fazendo um bom progresso na implementação de toda a linguagem C ++. No entanto, quando você se dedica a isso, o Intel C ++ ainda é melhor do que qualquer um dos dois aspectos, e é um pacote único que faz a maioria das coisas corretamente, em vez de precisar de um compilador para bons diagnósticos e outro para melhor conformidade e geração de código.

Jerry Coffin
fonte
14

Tentamos isso no trabalho há um tempo. A maior parte de nossa base de código está em Delphi, mas temos algumas funcionalidades altamente intensivas em computação que alguém pensou que seria uma boa idéia fazer em uma DLL C ++ no passado. E um dos meus colegas de trabalho ouviu grandes coisas sobre o compilador da Intel, então ele decidiu testá-lo. Nós reconstruímos a DLL no compilador Intel e executamos alguns testes de velocidade, e os resultados o surpreenderam tanto que ele imaginou que devia estar fazendo algo errado.

A DLL precisa calcular alguns problemas muito difíceis com componentes combinatórios e de topologia, que estão tecnicamente na classe de dificuldade NP-hard se os fizermos "certo", mas usamos várias heurísticas para evitar o desempenho do NP. Mesmo assim, há muitas trocas de números acontecendo. E para os testes que realizamos, a diferença entre o compilador VS e o compilador Intel estava dentro do epsilon ou o compilador Intel era visivelmente mais lento, geralmente em algum lugar na faixa de 20%. E ficou assim, independentemente das alterações que ele fez nas configurações de compilação para tentar fazer com que o compilador Intel produzisse códigos mais rápidos. Então acabamos não mudando para ele.

Este é apenas um exemplo do mundo real, é claro. Sua milhagem pode variar.

Mason Wheeler
fonte
Você se importaria de compartilhar os detalhes da CPU em que os benchmarks rodavam?
Oak
22
Quando li seu primeiro parágrafo, pensei que você estivesse dizendo que os resultados do teste de velocidade o surpreenderam de uma maneira positiva . Aparentemente, isso está errado, depois de ler o segundo parágrafo. Não tenho certeza do que me enganou na primeira leitura; após uma inspeção mais minuciosa, você na verdade não usa palavras positivas que possam ter me deixado com essa percepção. Só pensei em comentar se alguém mais cometer o mesmo erro e estiver confuso sobre o que você está realmente dizendo aqui.
Cody Grey
2
Você estava usando um processador AMD para o teste? Eu acho que é uma informação relevante (se o compilador teve um desempenho ruim de propósito ou se não conseguiu fazer nada, mesmo quando estava fazendo o melhor possível).
Reponha Monica
3
É um processador Intel Core i7.
Mason Wheeler
Versão curta: Intel era mais lento que o VS2010. Eu também tentei isso no trabalho há não muito tempo atrás, em uma base de código de dados bastante concisos que processam C ++. Eu tentei muitas configurações diferentes. Alguns algoritmos individuais com testes de desempenho já existentes ficaram notavelmente mais rápidos, mas mais notavelmente mais lentos. No geral, qualquer operação de alto nível que eu fiz com o software foi consistente e mensurável mais lenta. Eu também tentei isso com as versões 2013 e 2010 do compilador da Intel, 2010 parece codificar melhor os produtos, além de ser mais estável. A maioria dos meus testes foi em um pré-AVX i7, mas alguns em um Core2 mais antigo.
Rich
9

Em um aplicativo incorporado em que trabalhei, uma avaliação de um compilador Intel mostrou que isso nos pouparia a necessidade de rodar novo hardware com maior desempenho. O custo do novo hardware foi de cerca de US $ 10 / unidade, vendas projetadas de 1 milhão de unidades, adicionar custos de desenvolvimento e atrasos no projeto. A opção 2 era um perfil / micro otimização, uma base de código já razoavelmente bem perfilada / otimizada - resultados desconhecidos, tempo desconhecido.

O que você acha que o chefe disse quando pedimos os fundos para comprar o compilador .......

No entanto - esse foi um caso muito sortudo e raro - a saída de código 10% mais rápida do compilador Intel nos levou de volta ao lado correto do desempenho. Se já estivéssemos do lado certo, ou estivéssemos 10% acima, isso não faria diferença. Se tivéssemos os engenheiros, provavelmente poderíamos otimizar o código e salvar a rotação do hardware e não precisaríamos do compilador Intel, mas o risco era alto e o compilador Intel funcionava mais barato que o tempo de engenharia.

Em resumo, eu diria que é uma forma de micro otimização - não faça isso até que você saiba que precisa e só depois de criar um perfil e encontrar a causa real dos problemas. É uma escolha particularmente boa do seu perfil que mostra que você está lento em todos os lugares e não tem gargalo de garrafa identificado.

mattnz
fonte
5

Eu só encontrei três vantagens:

  1. Ele suporta recursos de CPUs Intel mais recentes muito antes do que outros compiladores.

  2. É um ótimo compilador adicional emitir avisos e detectar problemas que outros compiladores ignoram. O GCC captura algumas coisas que o ICC não faz e vice-versa. O Visual Studio captura algumas coisas que o ICC não faz e vice-versa.

  3. Ele realiza um trabalho muito melhor de loops de paralelismo automático (distribuindo-os automaticamente por vários threads) do que qualquer outro compilador. O código não se beneficia muito disso, mas quando você tem um código que faz isso, pode fazer muita diferença.

David Schwartz
fonte
3

Usamos o compilador Intel para todos os projetos críticos de desempenho da nossa base de código. O melhor de tudo é que isso torna o código de otimização realmente sustentável. Em vez de adicionar manualmente chamadas __mm em todos os lugares e pedir ao compilador para buscar previamente dados, os quais serão subotimizados no próximo lançamento novamente, basta reorganizar seu código e obter uma aceleração insana.

Freqüentemente, o código otimizado é mais fácil de seguir do que o otimizado manualmente, é mais rápido que o otimizado manualmente e, quando um novo conjunto de instruções é liberado, o compilador usa esse conjunto de instruções. É fantástico.

O mesmo vale para o compilador de braço (de braço, não intel), se você liberar no braço, faz um ótimo trabalho de vetorização para você.

martiert
fonte
+1. Intel tem um compilador ARM? Inacreditável!
11
Não, a Intel não possui um compilador ARM. O ARM possui um compilador ARM, que faz um trabalho fantástico.
martiert
2
"EDIT: arm não possui um compilador de arm." isso é realmente o que você quis dizer?
precisa saber é o seguinte
0

Verifique esta página de referência. Em suma, a Intel vence.

Mas a margem pode não ser tão grande: se você compilar em 32 bits, e seu sistema de compilação não puder suportar otimização guiada por perfil, o ganho é da ordem de 10%. Essa melhoria vale a pena e os tempos de compilação mais longos?

jdv-Jan de Vaan
fonte
O link do URL parece estar morto.
Contango 14/03
0

Dizem que a Intel lançou o Intel C ++ Compiler v13.0 para Android OS, sua primeira tentativa de fornecer um compilador C / C ++ otimizado, projetado especificamente para a plataforma móvel do Google.

Os desenvolvedores podem usar o compilador em sistemas baseados no Linux * para criar aplicativos para dispositivos Android baseados em processadores Intel, incluindo o processador Intel® Atom ™. O compilador Intel é compatível com o GNU C ++ e as ferramentas de desenvolvedor no Android Native Development Kit (NDK). Você também não pode usar o compilador em qualquer máquina de desenvolvimento. Nem o Windows nem o OS X são suportados; as ferramentas são certificadas apenas para uso com o Ubuntu 10.04 ou 11.04

A versão atual do Android NDK usa a versão 4.6 da cadeia de ferramentas Gnu Compiler Collection (GCC) de código aberto por padrão. Porém, os compiladores da Intel incluem muitas otimizações proprietárias de seus próprios chips e geralmente podem gerar códigos executáveis ​​com desempenho melhor que o produzido por compiladores de terceiros, como o GCC.

LOG_TAG
fonte