O que torna o Fortran rápido?

41

Fortran tem um lugar especial na programação numérica. Você certamente pode criar software bom e rápido em outros idiomas, mas o Fortran continua com um desempenho muito bom, apesar da idade. Além disso, é mais fácil criar programas rápidos no Fortran. Criei programas rápidos em C ++, mas você precisa ter mais cuidado com coisas como alias de ponteiro. Então, tem que haver uma razão para isso, e uma muito técnica. É porque o compilador pode otimizar mais? Eu realmente gostaria de saber detalhes técnicos, portanto, se eu usar outro idioma, posso levar essas coisas em consideração.

Por exemplo, eu sei - ou acho - que uma coisa é que o padrão especifica que os ponteiros são contíguos na memória sempre, o que significa acesso mais rápido à memória. Eu acredito que você pode fazer isso em C ++, dando uma bandeira ao compilador. Dessa forma, ajuda a saber o que o Fortran faz bem, para que, se estiver usando outro idioma, possamos imitar isso.

jbcolmenares
fonte
7
Eu diria que essa pode ser uma pergunta melhor para o stackoverflow, embora eu ache que seja uma boa pergunta. Uma pesquisa rápida ( stackoverflow.com/search?q=fortran+fast ) me leva a essa pergunta que pode ajudá-lo: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann
3
Você precisa especificar qual tipo de fortran você está usando. Há uma diferença substancial entre 77 e 90+. Estou assumindo que pelo menos 90, se estamos falando de ponteiros ...
qubyte
Eu sempre leio sobre Fortran ser mais rápido que C. Bem, talvez, mas é mais rápido como 2% ou mais rápido como 50%?
21711 shuhalo
4
É um mito urbano. A menos que o compilador possa usar instruções especiais, você pode otimizar manualmente quase qualquer programa, independentemente do compilador, para gerar aproximadamente a mesma linguagem de máquina.
Mike Dunlavey

Respostas:

50

Os designers de idiomas enfrentam muitas opções. Ken Kennedy enfatizou duas: (1) melhores abstrações e (2) código de nível superior ou inferior (menos ou mais semelhante a uma máquina). Enquanto linguagens funcionais como Haskell e Scheme se concentram nas primeiras, linguagens tradicionais de computação científica como Fortran e C / C ++ se concentraram na segunda. Dizer que um idioma é mais rápido que o outro geralmente é bastante enganador: cada idioma tem um domínio de problemas pelo qual se destaca. O Fortran se sai melhor no domínio dos códigos numéricos baseados em array do que em outros idiomas por dois motivos básicos: seu modelo de array e sua explicitação.

Modelo de matriz

Os programadores do Fortran fazem grande parte das manipulações de array. Para isso, o Fortran facilita várias otimizações do compilador que não estão disponíveis em outros idiomas. O melhor exemplo é a vetorização: conhecer o layout dos dados permite que o compilador invoque intrínsecos no nível da montagem sobre a matriz.

Explicitação do idioma

Embora pareça que uma linguagem mais simples compile "melhor" do que uma mais complexa, esse não é realmente o caso. Quando se escreve em uma linguagem assembly , não há muito o que um compilador possa fazer: tudo o que vê são instruções muito refinadas. O Fortran requer explicitação (portanto, mais trabalho do programador) apenas nos casos que geram recompensas reais para a computação baseada em array. O Fortran usa tipos de dados simples, fluxo de controle básico e namespaces limitados; por outro lado, não informa ao computador como carregar registros (o que pode ser necessário em tempo real ). Onde o Fortran é explícito, ele permite coisas como inferência completa de tipos, o que ajuda os iniciantes a começar. Também evita uma coisa que muitas vezes torna o C lento:ponteiros opacos .

Fortran pode ser lento

O Fortran não é rápido para todas as tarefas: é por isso que muitas pessoas não o usam para criar GUIs ou mesmo para computação científica altamente não estruturada. Depois que você sai do mundo das matrizes para gráficos, árvores de decisão e outras regiões, essa vantagem de velocidade desaparece rapidamente. Veja os benchmarks de linguagem de computador para alguns exemplos e números.

aterrel
fonte
7
Os problemas da GUI / IO podem ser facilmente resolvidos agrupando a trituração do Fortran em uma linguagem "de uso mais geral". Eu freqüentemente uso R para esse fim.
MBq
2
shootout.alioth.debian.org não está mais disponível! E a nova versão tem muito menos informações :(
astrojuanlu
23

O design do Fortran permite que o compilador execute otimizações mais fortes em alguns casos, otimizações que geralmente não estão disponíveis para C.

Um exemplo famoso é o tratamento do alias . No Fortran, você pode acessar uma área de memória específica apenas através do símbolo específico associado a essa área de memória. Esse conhecimento permite que o compilador use truques inteligentes na hora de armazenar em cache: ele sabe se um valor foi potencialmente alterado ou não. Até a F90, isso foi verificado facilmente. Quando Fortran 90 introduzida pointers, a suposição não era verdade: você pode acessar a mesma área de memória através de dois símbolos (ou mais). Essa é a razão pela qual você deve especificar as targetmatrizes que deseja endereçar por meio de ponteiros.

Outro fato interessante é que muitas construções permitem que o compilador execute paralelização sem intervenção do usuário. Esse luxo é possível devido ao relativo "agnosticismo da plataforma" de Fortran como idioma.

Existem muitos outros truques sutis como este. Além disso, lembre-se de que ninguém usa o Fortran hoje, exceto para cálculos numéricos, o que significa que o principal recurso e ponto de venda dos compiladores Fortran é a velocidade resultante do código. Como resultado, os fornecedores se concentraram nisso.

No entanto, você pode produzir código de desempenho também com outros idiomas. Pode, no entanto, exigir cuidados especiais ou intervenção humana. O ponto geral, no entanto, é que o desempenho não é um problema até que haja um problema, e o tempo de trabalho é muito mais caro que o tempo do computador. Portanto, as práticas de codificação devem se concentrar em economizar tempo humano, em vez de tempo no computador.

Stefano Borini
fonte
2
Quando seus computadores chegam a mais de US $ 100 milhões, o tempo das pessoas (estudantes de graduação) deixa de parecer tão caro em comparação.
Phil Miller
6
@Novelocrat: a quantidade de código que roda em um computador de US $ 100 milhões foi escrita por incontáveis ​​horas-homem que vão muito além da marca de US $ 100 milhões, mesmo a preços de estudantes graduados. Lembre-se que os custos de uma pessoa são o dobro de sua renda. O resto entra em impostos e se correlaciona. Além disso, um computador não apresenta queimadura. Uma pessoa faz e mudará de emprego.
Stefano Borini
11
@StefanoBorini Eu tenho uma longa história de PCs que experimentou queimar ...
N74
11
"Além disso, lembre-se de que ninguém usa o Fortran hoje, exceto para cálculos numéricos", Fortran = "FORmula TRANslation". O Fortran sempre foi usado principalmente e projetado para cálculos numéricos. O Fortran possui uma grande parcela do tempo dos computadores de alto desempenho.
user21387 5/08
Hoje, como sempre, o Fortran é usado para a mesma finalidade - cálculos numéricos.
sequência
12

Não acho que Fortran seja tão próximo do metal (veja outra resposta), mas tende a otimizar com muita facilidade. Os loops são simples, e o idioma suporta extensões de vetorização (ok, quando eu o usei no meu primeiro trabalho, tínhamos como alvo uma ampla gama de ferro grande de vetor).

Há também o grande fator de inércia. Muitos códigos numéricos estão no Fortran; portanto, os construtores de servidores e supercomputadores avançados garantem que escrevam bem os otimizadores do Fortran. Os compiladores são bons (mesmo em máquinas com uma relativa falta de compiladores de alta qualidade), portanto os usuários continuam a usar o Fortran e até escrevem novos códigos nele. Assim, os construtores garantem que sua próxima geração tenha bons compiladores, etc ...

winwaed
fonte
8

Tenha cuidado com os mitos urbanos aqui. Se dois compiladores gerarem o mesmo código de montagem, os programas resultantes terão o mesmo desempenho.

Para qualquer peça de lógica, existe um programa em linguagem assembly que minimiza o tempo de execução. Esse programa não se importa com qual compilador o gerou.

Dito isto, existem linguagens compiladas para facilitar a vida do programador. Parte do custo disso é que eles podem tentar o usuário a usar recursos que não resultam em tempo de execução mínimo. O principal exemplo disso é newem C ++. (Quão lento pode ser - são apenas três caracteres?) Praticamente implora que você aloque dinamicamente a memória e não preste atenção ao custo de tempo de execução. Se é isso que você quer fazer, isso é fantástico, mas o Fortran pode ser mais rápido só porque não o incentivou a fazer isso.

Mas muito além disso, eu nunca vi um programa que, como o primeiro escrito, não tem grande espaço para melhorias do tipo que o compilador nunca poderia limpar para você desempenho. Como exemplo, gastar uma grande fração do tempo ligando expe / ou logrepetidamente com o mesmo argumento. Como outro exemplo, chamar DGEMM para multiplicar matrizes e descobrir que uma grande fração de tempo entra em chamar LSAME apenas para decifrar seus argumentos de caracteres de entrada.

Isso ocorre ao mesmo tempo em que as pessoas dizem que o Fortran é mais rápido devido ao alias do ponteiro ou ao desenrolar do loop. É como dizer que um ônibus fabricado pela Porsche certamente seria mais rápido que um ônibus fabricado pela Chevrolet. Precisa haver um pouco de bom senso.

Mike Dunlavey
fonte
4
Eu não acho que é apenas um mito urbano. O suporte do Fortran para operações de toda a matriz, funções PURE / ELEMENTAL etc. pode ajudar os compiladores a otimizar / vetorizar ou até paralelizar facilmente. Por exemplo, consulte thinkingparallel.com/2007/08/14/… . O que os compiladores realmente fazem é uma história diferente (depende do fornecedor).
stali
@ stali: Depende de mais do que o fornecedor. Depende do programa que está sendo compilado. Vi pessoas generalizarem de "existe um programa que o Fortran pode executar rapidamente" para "o Fortran é mais rápido em qualquer programa". Se você apontar isso, as pessoas podem começar a bainha, a cortar e a dividir os cabelos, e o que realmente se resume no final é basicamente nada além do que as pessoas querem pensar.
9118 Mike Dunlavey