better - Fortran é mais fácil de otimizar do que C para cálculos pesados?



performance (16)

Sim, em 1980; Em 2008? Depende

Quando comecei a programar profissionalmente, o domínio de velocidade do Fortran estava apenas sendo desafiado. Eu me lembro de ler sobre isso no Dr. Dobbs e dizer aos programadores mais velhos sobre o artigo - eles riram.

Então eu tenho dois pontos de vista sobre isso, teórico e prático. Em teoria, o Fortran hoje não tem vantagem intrínseca em C / C ++ ou mesmo em qualquer linguagem que permita o código de montagem. Na prática, o Fortran hoje ainda desfruta dos benefícios do legado de uma história e cultura construída em torno da otimização do código numérico.

Até e incluindo o Fortran 77, as considerações de design de linguagem tiveram a otimização como foco principal. Devido ao estado da teoria e da tecnologia do compilador, isso geralmente significava restringir recursos e capacidade para dar ao compilador a melhor chance de otimizar o código. Uma boa analogia é pensar no Fortran 77 como um carro de corrida profissional que sacrifica recursos por velocidade. Atualmente, os compiladores melhoraram em todos os idiomas e os recursos para a produtividade do programador são mais valorizados. No entanto, ainda existem lugares onde as pessoas estão preocupadas principalmente com a velocidade na computação científica; essas pessoas provavelmente herdaram código, treinamento e cultura de pessoas que eram programadoras do Fortran.

Quando alguém começa a falar sobre a otimização do código, há muitos problemas, e a melhor maneira de ter uma ideia disso é espreitar onde as pessoas têm o trabalho de ter um código numérico rápido . Mas tenha em mente que esse código criticamente sensível é geralmente uma pequena fração das linhas gerais de código e é muito especializado: muito código Fortran é tão "ineficiente" quanto muitos outros códigos em outras linguagens e a otimização não deveria ser uma preocupação primária de tal código .

Um lugar maravilhoso para começar a aprender sobre a história e cultura do Fortran é a Wikipédia. A entrada no Fortran Wikipedia é excelente e eu aprecio muito aqueles que tomaram o tempo e esforço para torná-lo de valor para a comunidade Fortran.

(Uma versão abreviada desta resposta teria sido um comentário no excelente tópico iniciado por Nils, mas eu não tenho o karma para fazer isso. Na verdade, eu provavelmente não teria escrito nada, a não ser conteúdo de informação e compartilhamento em oposição a guerras flamejantes e fanatismo de linguagem, que é minha principal experiência com esse assunto. Fiquei impressionado e tive que compartilhar o amor.)

De vez em quando eu li que o Fortran é ou pode ser mais rápido que o C para cálculos pesados. Isso é realmente verdade? Devo admitir que mal conheço o Fortran, mas o código do Fortran que vi até agora não mostrou que a linguagem possui recursos que o C não possui.

Se é verdade, por favor me diga porquê. Por favor, não me diga quais linguagens ou bibliotecas são boas para processamento de números, não pretendo escrever um aplicativo ou lib para fazer isso, estou apenas curioso.


Answer #1

É engraçado que muitas respostas aqui não conheçam as línguas. Isso é especialmente verdadeiro para programadores C / C ++ que abriram e usaram o código FORTRAN 77 e discutem os pontos fracos.

Eu suponho que o problema de velocidade é principalmente uma questão entre C / C ++ e Fortran. Em um código enorme, sempre depende do programador. Existem alguns recursos da linguagem que o Fortran supera e alguns recursos que o C faz. Então, em 2011, ninguém pode realmente dizer qual é o mais rápido.

Sobre a própria linguagem, o Fortran atualmente suporta recursos OOP completos e é totalmente compatível com versões anteriores. Eu usei o Fortran 2003 completamente e eu diria que foi simplesmente delicioso usá-lo. Em alguns aspectos, o Fortran 2003 ainda está por trás do C ++, mas vamos ver o uso. Fortran é usado principalmente para Computação Numérica, e ninguém usa recursos extravagantes de O ++ C ++ por razões de velocidade. Na computação de alto desempenho, o C ++ quase não tem lugar para ir (dê uma olhada no padrão MPI e você verá que o C ++ foi obsoleto!).

Hoje em dia, você pode simplesmente fazer programação em linguagem mista com Fortran e C / C ++. Existem até interfaces para o GTK + no Fortran. Existem compiladores gratuitos (gfortran, g95) e muitos excelentes comerciais.


Answer #2

Eu acho que o ponto chave em favor do Fortran é que é uma linguagem um pouco mais adequada para expressar matemática baseada em vetores e matrizes. A questão da análise do ponteiro apontada acima é real na prática, já que o código portátil não pode realmente assumir que você pode dizer algo ao compilador. Há sempre uma vantagem em expressar computações de uma maneira mais próxima de como o domínio se parece. C realmente não tem matrizes, se você olhar de perto, apenas algo que se comporta como tal. Fortran tem arrawys reais. O que facilita a compilação de certos tipos de algoritmos, especialmente para máquinas paralelas.

No fundo, coisas como sistema de tempo de execução e convenções de chamada, o C e o moderno Fortran são suficientemente similares, e é difícil ver o que faria a diferença. Note que C aqui é realmente básico C: C ++ é um problema totalmente diferente com características de desempenho muito diferentes.


Answer #3

Eu comparo a velocidade de Fortran, C e C ++ com o benchmark clássico de Levine-Callahan-Dongarra do netlib. A versão em vários idiomas, com o OpenMP, é http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectors O C é mais feio, já que começou com a tradução automática, além da inserção de restrições e pragmas para certas compiladores. C ++ é apenas C com modelos STL, quando aplicável. Na minha opinião, o STL é um saco misto para melhorar a manutenção.

Há apenas um mínimo de exercício de função automática de alinhamento para ver até que ponto isso melhora a otimização, uma vez que os exemplos são baseados na prática tradicional de Fortran, onde pouca confiança é dada ao enfileiramento.

O compilador C / C ++, que tem de longe o uso mais difundido, carece de autovetorização, no qual esses benchmarks dependem fortemente.

Re o post que veio pouco antes disso: há um par de exemplos onde parênteses são usados ​​em Fortran para ditar a ordem mais rápida ou mais precisa de avaliação. Os compiladores C conhecidos não têm opções para observar os parênteses sem desativar as otimizações mais importantes.


Answer #4

Eu não ouvi dizer que Fortan é significativamente mais rápido que C, mas pode ser concebível que, em certos casos, seja mais rápido. E a chave não está nos recursos da linguagem que estão presentes, mas naqueles que (geralmente) estão ausentes.

Um exemplo são os ponteiros C. Os ponteiros C são usados ​​em praticamente todos os lugares, mas o problema com os ponteiros é que o compilador geralmente não sabe se está apontando para as diferentes partes da mesma matriz.

Por exemplo, se você escreveu uma rotina strcpy que se parece com isso:

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

O compilador tem que trabalhar sob a suposição de que d e s podem estar sobrepostos em matrizes. Portanto, não é possível realizar uma otimização que produza resultados diferentes quando as matrizes se sobrepõem. Como seria de esperar, isso restringe consideravelmente o tipo de otimizações que podem ser realizadas.

[Devo observar que C99 tem uma palavra-chave "restrict" que informa explicitamente aos compiladores que os ponteiros não se sobrepõem. Observe também que o Fortran também possui ponteiros, com semânticas diferentes daqueles de C, mas os ponteiros não são onipresentes como em C.]

Mas voltando ao problema C vs. Fortran, é concebível que um compilador Fortran seja capaz de realizar algumas otimizações que podem não ser possíveis para um programa C (escrito diretamente). Então eu não ficaria surpreso com a alegação. No entanto, espero que a diferença de desempenho não seja tanto assim. [~ 5-10%]


Answer #5

Eu sou um programador amadores e sou "mediano" em ambos os idiomas. Eu acho mais fácil escrever código Fortran rápido que código C (ou C ++). Tanto o Fortran quanto o C são linguagens "históricas" (até hoje padrão), são muito usados ​​e têm um bom suporte para compiladores gratuitos e comerciais.

Eu não sei se é um fato histórico, mas o Fortran se sente como se fosse construído para ser paralelo / distribuído / vetorizado / o que quer que seja multicor. E hoje é praticamente a "métrica padrão" quando estamos falando de velocidade: "ela escala?"

Para cpu trituração pura eu amo Fortran. Para qualquer coisa IO relacionado eu acho mais fácil trabalhar com C. (é difícil em ambos os casos de qualquer maneira).

Agora, é claro, para códigos intensivos de matemática paralelos você provavelmente quer usar sua GPU. Tanto C quanto Fortran possuem uma interface CUDA / OpenCL mais ou menos bem integrada (e agora OpenACC).

Minha resposta moderadamente objetiva é: Se você conhece ambos os idiomas igualmente bem / mal, acho que o Fortran é mais rápido porque acho mais fácil escrever código paralelo / distribuído em Fortran do que C. (uma vez que você entendeu que pode escrever fortran de forma livre) não apenas código F77 estrito)

Aqui está uma segunda resposta para aqueles dispostos a me downvote porque eles não gostam da primeira resposta: Ambos os idiomas têm os recursos necessários para escrever código de alto desempenho. Portanto, depende do algoritmo que você está implementando (intensivo de CPU intensivo de memória intensiva), do hardware (single cpu multi-core? Distribuir supercomputador GPGPU FPGA?), Sua habilidade e, finalmente, o próprio compilador. Ambos C e Fortran têm um compilador incrível. (Eu estou seriamente espantado com a forma como os compiladores avançados do Fortran são, mas também os compiladores C).

PS: Fico feliz que você tenha excluído especificamente libs porque eu tenho uma grande quantidade de coisas ruins a dizer sobre as bibliotecas de GUI do Fortran. :)


Answer #6

Existem várias razões pelas quais o Fortran pode ser mais rápido. No entanto, a quantidade que importa é tão inconseqüente ou pode ser trabalhada de qualquer maneira, que não importa. A principal razão para usar o Fortran atualmente é manter ou estender os aplicativos legados.

  • Palavras-chave PURA e ELEMENTAL em funções. Estas são funções que não têm efeitos colaterais. Isso permite otimizações em certos casos em que o compilador sabe que a mesma função será chamada com os mesmos valores. Observação: o GCC implementa "puro" como uma extensão do idioma. Outros compiladores também podem. A análise intermodular também pode realizar essa otimização, mas é difícil.

  • conjunto padrão de funções que lidam com matrizes, não com elementos individuais. Coisas como sin (), log (), sqrt () usam arrays ao invés de escalares. Isso facilita a otimização da rotina. A autovetorização fornece os mesmos benefícios na maioria dos casos, se essas funções forem embutidas ou incorporadas

  • Builtin tipo complexo. Em teoria, isso poderia permitir ao compilador reordenar ou eliminar certas instruções em certos casos, mas provavelmente você veria o mesmo benefício com o struct {double re, im; }; idioma usado em C. Ele permite um desenvolvimento mais rápido, já que os operadores trabalham em tipos complexos em fortran.


Answer #7

Não existe tal coisa como uma língua sendo mais rápida do que outra, então a resposta apropriada é não .

O que você realmente tem que perguntar é "o código compilado com o compilador Fortran X é mais rápido que o código equivalente compilado com o compilador C?" A resposta a essa questão depende, é claro, de quais compiladores você escolhe.

Outra pergunta que alguém poderia fazer seria a seguinte: "Dada a mesma quantidade de esforço colocada na otimização em seus compiladores, qual compilador produziria um código mais rápido?" A resposta para isso seria de fato Fortran . Os compiladores Fortran possuem vantagens certianas:

  • Fortran teve que competir com o Assembly no passado, quando alguns juraram nunca usar compiladores, então ele foi projetado para velocidade. C foi projetado para ser flexível.
  • O nicho de Fortran tem sido processado em número. Neste código de domínio nunca é rápido o suficiente. Portanto, sempre houve muita pressão para manter a linguagem eficiente.
  • A maioria das pesquisas em otimizações de compiladores é feita por pessoas interessadas em acelerar o código de processamento de código do Fortran, então otimizar o código Fortran é um problema muito mais conhecido do que otimizar qualquer outra linguagem compilada, e novas inovações aparecem primeiro nos compiladores Fortran.
  • Biggie : C encoraja muito mais uso de ponteiro do que Fortran. Isso aumenta drasticamente o escopo potencial de qualquer item de dados em um programa C, o que os torna muito mais difíceis de otimizar. Note que Ada também é muito melhor que C neste reino, e é uma linguagem OO muito mais moderna do que o comumente encontrado Fortran77. Se você quer um langauge OO que possa gerar código mais rápido que C, esta é uma opção para você.
  • Devido novamente ao seu nicho de processamento, os clientes dos compiladores Fortran tendem a se preocupar mais com a otimização do que os clientes dos compiladores C.

No entanto, não há nada que impeça alguém de investir muito na otimização de seu compilador C e de gerar um código melhor que o compilador Fortran de sua plataforma. De fato, as maiores vendas geradas pelos compiladores C tornam este cenário bastante viável


Answer #8

Os idiomas têm conjuntos de recursos semelhantes. A diferença de desempenho vem do fato de que Fortran diz que o aliasing não é permitido, a menos que uma instrução EQUIVALENCE seja usada. Qualquer código que tenha aliasing não é válido para o Fortran, mas cabe ao programador e não ao compilador detectar esses erros. Assim, os compiladores Fortran ignoram o possível aliasing dos ponteiros de memória e permitem que eles gerem códigos mais eficientes. Dê uma olhada neste pequeno exemplo em C:

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

Essa função seria executada mais lentamente que a contraparte do Fortran após a otimização. Por quê? Se você escrever valores na matriz de saída, poderá alterar os valores da matriz. Afinal, os ponteiros podem se sobrepor e apontar para o mesmo pedaço de memória (incluindo o ponteiro int !). O compilador C é forçado a recarregar os quatro valores de matriz da memória para todos os cálculos.

Em Fortran, o compilador pode carregar os valores da matriz uma vez e armazená-los em registradores. Pode fazê-lo porque o compilador Fortran assume que os ponteiros / matrizes não se sobrepõem na memória.

Felizmente, a palavra-chave restrict e o estrito aliasing foram introduzidos no padrão C99 para resolver esse problema. É bem suportado na maioria dos compiladores C ++ atualmente também. A palavra-chave permite que você dê ao compilador uma dica de que o programador promete que um ponteiro não possui um alias com outro ponteiro. O estrito alias significa que o programador promete que ponteiros de tipos diferentes nunca se sobreporão, por exemplo, um double* não se sobreporá a um int* (com a exceção específica de que char* e void* podem se sobrepor a qualquer coisa).

Se você usá-los, você obterá a mesma velocidade de C e Fortran. No entanto, a capacidade de usar a palavra-chave restrict apenas com funções críticas de desempenho significa que os programas C (e C ++) são muito mais seguros e fáceis de escrever. Por exemplo, considere o código Fortran inválido: CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30) , que a maioria dos compiladores Fortran irão compilar sem qualquer aviso, mas apresenta um erro que só aparece em alguns compiladores, em algum hardware e com algumas opções de otimização.


Answer #9

Quaisquer diferenças de velocidade entre Fortran e C serão mais uma função das otimizações do compilador e da biblioteca matemática subjacente usada pelo compilador específico. Não há nada intrínseco ao Fortran que o torne mais rápido que o C.

De qualquer forma, um bom programador pode escrever Fortran em qualquer idioma.


Answer #10

A maioria dos posts já apresenta argumentos convincentes, por isso vou apenas adicionar os 2 centavos proverbiais a um aspecto diferente.

Ser fortran mais rápido ou mais lento em termos de poder de processamento no final pode ter sua importância, mas se levar 5 vezes mais tempo para desenvolver algo em Fortran porque:

  • falta uma boa biblioteca para tarefas diferentes do processamento puro de números
  • falta qualquer ferramenta decente para documentação e testes unitários
  • é uma linguagem com expressividade muito baixa, disparando o número de linhas de código.
  • tem um manejo muito ruim de cordas
  • Ele tem uma quantidade absurda de problemas entre diferentes compiladores e arquiteturas que deixam você louco.
  • tem uma estratégia de IO muito pobre (READ / WRITE de arquivos seqüenciais. Sim, existem arquivos de acesso aleatório, mas você já os viu usados?)
  • não incentiva boas práticas de desenvolvimento, modularização.
  • falta efetiva de um compilador opensource totalmente padrão e totalmente compatível (tanto o gfortran quanto o g95 não suportam tudo)
  • interoperabilidade muito pobre com C (mangling: um sublinhado, dois sublinhados, nenhum sublinhado, em geral um sublinhado, mas dois se houver outro sublinhado. e apenas não investigar blocos COMMON ...)

Então a questão é irrelevante. Se algo está lento, na maioria das vezes você não pode melhorá-lo além de um determinado limite. Se você quiser algo mais rápido, mude o algoritmo. No final, o tempo do computador é barato. O tempo humano não é. Valorize a escolha que reduz o tempo humano. Se aumentar o tempo do computador, é rentável de qualquer maneira.


Answer #11

O Fortran tem melhores rotinas de E / S, por exemplo, o recurso implied do dá flexibilidade que a biblioteca padrão do C não pode igualar.

O compilador Fortran lida diretamente com a sintaxe mais complexa envolvida e, como tal, a sintaxe não pode ser facilmente reduzida à forma de passagem de argumentos, o C não pode implementá-la com eficiência.


Answer #12

Fortran tradicionalmente não define opções como -fp: strict (que o ifort requer para ativar alguns dos recursos em USE IEEE_arithmetic, uma parte do padrão f2003). O Intel C ++ também não define -fp: strict como padrão, mas isso é necessário para o tratamento de ERRNO, por exemplo, e outros compiladores de C ++ não tornam conveniente desativar ERRNO ou obter otimizações como redução de simulação. O gcc e o g + + requereram que eu configurasse o Makefile para evitar o uso da combinação perigosa -O3 -ffast-math -fopenmp -march = native. Além desses problemas, essa questão sobre desempenho relativo fica mais exigente e depende das regras locais sobre a escolha de compiladores e opções.


Answer #13

Geralmente, FORTRAN é mais lento que C. O C pode usar ponteiros de nível de hardware, permitindo que o programador otimize manualmente. FORTRAN (na maioria dos casos) não tem acesso a hacks de endereçamento de memória de hardware. (VAX FORTRAN é outra história.) Eu uso o FORTRAN desde os anos 70. (Mesmo.)

No entanto, a partir dos anos 90, o FORTRAN evoluiu para incluir construções de linguagem específicas que podem ser otimizadas em algoritmos inerentemente paralelos que podem realmente gritar em um processador multi-core. Por exemplo, a Vetorização automática permite que vários processadores manipulem cada elemento em um vetor de dados simultaneamente. 16 processadores - processamento vetorial de 16 elementos leva 1 / 16th o tempo.

Em C, você precisa gerenciar seus próprios segmentos e projetar seu algoritmo cuidadosamente para o multiprocessamento e, em seguida, usar várias chamadas de API para garantir que o paralelismo ocorra corretamente.

Em FORTRAN, você só precisa projetar seu algoritmo cuidadosamente para o multiprocessamento. O compilador e o tempo de execução podem manipular o resto para você.

Você pode ler um pouco sobre o High Performance Fortran , mas você encontra muitos links mortos. É melhor ler sobre Programação Paralela (como o OpenMP.org ) e como o FORTRAN suporta isso.


Answer #14

O Fortran pode manipular matrizes, especialmente matrizes multidimensionais, muito convenientemente. Fatiar elementos do array multidimensional em Fortran pode ser muito mais fácil do que em C / C ++. C ++ agora tem bibliotecas que podem fazer o trabalho, como Boost ou Eigen, mas elas são, afinal, bibliotecas externas. Em Fortran estas funções são intrínsecas.

Se o Fortran é mais rápido ou mais conveniente para o desenvolvimento depende principalmente do trabalho que você precisa concluir. Como uma pessoa de computação científica para geofísica, eu fiz a maior parte do cálculo em Fortran (quero dizer Fortran moderno,> = F90).


Answer #15

O código mais rápido não está na altura da linguagem, é o compilador então você pode ver o ms-vb "compilador" que gera código de objeto inchado, lento e redundante que é amarrado dentro de um ".exe", mas o powerBasic também gera melhor código. Código de objeto feito por compiladores C e C ++ é gerado em algumas fases (pelo menos 2), mas pelo design a maioria dos compiladores Fortran tem pelo menos 5 fases incluindo otimizações de alto nível, então por design o Fortran sempre terá a capacidade de gerar código altamente otimizado. Então, no final é o compilador não a linguagem que você deve pedir, o melhor compilador que eu conheço é o Intel Fortran Compiler, porque você pode obtê-lo no Linux e Windows e você pode usar VS como o IDE, se você está procurando um Compilador Tigh barato você pode sempre transmitir no OpenWatcom.

Mais informações sobre isso: http://ed-thelen.org/1401Project/1401-IBM-Systems-Journal-FORTRAN.html





fortran