No meu programa de doutorado em ciências computacionais, estamos trabalhando quase exclusivamente em C ++ e Fortran. Parece que alguns professores preferem um ao outro. Eu estou querendo saber qual é 'melhor' ou se é melhor que o outro em uma determinada circunstância.
56
Respostas:
Como muitas vezes, a escolha depende de (1) o problema que você está tentando resolver, (2) as habilidades que você tem e (3) as pessoas com quem trabalha (a menos que seja um projeto solo). Deixarei (3) de lado por enquanto, pois depende da situação individual de todos.
Dependência do problema: o Fortran se destaca no processamento do array. Se o seu problema puder ser descrito em termos de estruturas de dados simples e, em particular, de matrizes, o Fortran está bem adaptado. Os programadores do Fortran acabam usando matrizes mesmo em casos não óbvios (por exemplo, para representar gráficos). O C ++ é mais adequado para estruturas de dados complexas e altamente dinâmicas.
Dependência de habilidades: é preciso muito mais experiência em programação para escrever bons programas C ++ do que para escrever bons programas Fortran. Se você começar com pouca experiência em programação e tiver muito tempo para aprender esse aspecto do seu trabalho, provavelmente obterá um melhor retorno do investimento aprendendo o Fortran do que aprendendo C ++. Supondo, é claro, que seu problema seja adequado ao Fortran.
No entanto, há mais na programação do que apenas Fortran e C ++. Eu recomendo a qualquer um que entre na ciência da computação que comece com uma linguagem dinâmica de alto nível, como o Python. Lembre-se sempre de que seu tempo é mais valioso que o tempo da CPU!
fonte
Penso que C ++ e Fortran são bons o suficiente e funcionam bem.
No entanto, acho que o Fortran é melhor para a computação científica numérica , para algoritmos que podem ser expressos usando matrizes e não precisam de outras estruturas de dados sofisticadas; portanto, em campos como diferenças / elementos finitos, solucionadores de PDE, cálculos de estrutura eletrônica. Fortran é um idioma específico do domínio. Em particular, acho que é mais fácil escrever programas rápidos no Fortran do que no C ++, por um cientista (não necessariamente um especialista em ciência da computação).
O C ++ é uma linguagem de uso geral, portanto, é possível expressar qualquer algoritmo, e definitivamente é melhor para algoritmos que não podem ser expressos usando matrizes, do campo HPC provavelmente alguns gráficos, geradores de malha, manipulação simbólica e assim por diante.
Também é possível escrever algoritmos de array em C ++, mas, na minha experiência, requer muito mais conhecimento de ciência da computação e, em geral, mais trabalho (ou seja, é preciso criar ou reutilizar classes para manipulação de array e lidar com o gerenciamento de memória manualmente ou usando alguns biblioteca como Teuchos de Trilinos). Os não especialistas tendem a escrever programas Fortran muito bons, mas programas C ++ horríveis (falando da minha própria experiência).
Isenção de responsabilidade: Eu pessoalmente gosto muito de Fortran e prefiro o C ++ para computação numérica. Passei mais de 2 anos de programação diária em C ++ e quase um ano em programação diária moderna de Fortran (na área de elementos finitos). Também uso muito o Python e o Cython.
fonte
Também estou jogando meus dois centavos tarde demais, mas acabei de ver esse tópico e sinto que, para a posteridade, há alguns pontos que precisam desesperadamente ser feitos.
Observe a seguir que falarei sobre C e não sobre C ++. Por quê? Bem, caso contrário, são maçãs e laranjas comparar uma linguagem orientada a objetos de tipo dinâmico e tipicamente desenvolvida com algo tão estático quanto o Fortran. Sim, algumas implementações modernas dos mais recentes padrões do Fortran podem fazer mais do que apenas isso, mas poucas pessoas realmente os usam e, portanto, quando falamos do Fortran, pensamos em linguagem simples, estática e imperativa. É aí que C também está, então substituirei C por C ++ para o seguinte.
Antes de tudo, qualquer discussão sobre Fortran / C com melhores compiladores é discutível. Compiladores C / Fortran dedicados são coisa do passado. O gcc / gfortran e o icc / ifc são apenas front-ends diferentes para o mesmo back-end, ou seja, seu programa será transformado em uma descrição abstrata pelo front-end e, em seguida, otimizado e montado pelo back-end. Se você escrever, semântica, o mesmo código no Fortran ou no C, o compilador produzirá, nos dois casos, o mesmo assembly que será executado com a mesma rapidez.
Isso agora leva ao meu segundo ponto: por que ainda vemos diferenças? O problema é que a maioria das comparações é feita pelos programadores do Fortran tentando algo em C ou vice-versa. Já reparou como a maioria dos autores ou poetas prefere escrever em seus idiomas nativos? Você gostaria de escrever poesia em um idioma em que não se sinta completamente confiante ou em casa? Claro que não ... eu mesmo considero C a minha linguagem de programação "nativa". No entanto, também passei três anos trabalhando em um grupo que usava apenas o Fortran, no qual atingi um certo nível de fluência. Entretanto, eu nunca escreveria nada sozinho no Fortran, pois estou mais à vontade com C e, como conseqüência, o código resultante será melhor , independentemente do que você definir.
Portanto, a principal diferença está no programador, não no idioma. Então não há diferenças? Bem, não exatamente. Aqui estão alguns exemplos:
SIMD: Seja SSE, SSE3 ou AltiVec, se você quiser usá-los no Fortran, é melhor esperar e rezar para que o compilador adivinhe exatamente o que você deseja e faça isso. Boa sorte. Em C, você geralmente possui funções intrínsecas para cada arquitetura ou, mais recentemente, tipos gerais de vetores SIMD no gcc . A maioria dos compiladores Fortran usará apenas instruções SIMD para desenrolar os loops, mas se você tiver um kernel que funcione em vetores curtos de dados de maneira não óbvia, o compilador provavelmente não o verá.
Arquiteturas de hardware diferentes: Toda a arquitetura CUDA é construída em torno de kernels em C. Sim, o Portland Group agora também possui um compilador fortran compatível com CUDA , mas é comercial e, o mais importante, não é da NVIDIA. O mesmo vale para o OpenCL, para o qual o melhor que pude encontrar é um projeto recente que suporta apenas algumas chamadas básicas.
Programação paralela: Sim, o MPI e o OpenMP funcionam bem com o C e o Fortran. No entanto, se você quiser um controle real de seus threads, ou seja, se você tiver um cálculo de memória compartilhada totalmente dinâmico, estará no frio com o Fortran. Em C, você tem os pthreads padrão que, embora não sejam quentes e difusos, ainda o levarão pela tempestade. Em geral, a maioria dos cálculos que dependem do acesso ao sistema operacional, por exemplo, threads, processos, sistema de arquivos, etc ... é melhor atendida com C. Ah, e não tente fazer sua própria rede com o Fortran.
Facilidade de uso: o Fortran está mais próximo do Matlab do que o C. Depois de ler todas as palavras-chave diferentes e como declarar variáveis, o restante do código se parece com o Matlab, tornando-o mais acessível para usuários com experiência limitada em programação.
Interoperabilidade: Quando você cria uma estrutura em C, o layout dos dados reais é direto e determinístico. No Fortran, se você usar matrizes de ponteiro ou dados estruturados, o layout real dos dados depende fortemente do compilador, não é direto e geralmente é completamente sem documentos. Você pode chamar C do Fortran e vice-versa, mas não comece a pensar que pode ser tão fácil transmitir algo além de uma matriz estática de um para o outro e vice-versa.
Isso tudo é um pouco nerd, de baixo nível, mas estamos falando de computação de alto desempenho, certo? Se você não está interessado em explorar melhor os paradigmas de hardware subjacentes, como implementar e / ou desenvolver algoritmos que são melhores para memória compartilhada / distribuída, threads, vetorização SIMD, GPUs usando SIMT e assim por diante, então você está apenas fazendo contas em um computador.
Isso ficou muito mais tempo do que qualquer coisa que eu entendesse, então aqui está um resumo - um conjunto de mensagens de tipo:
fonte
Dos meus 15 anos pensando em software científico: se seu código for 25% mais rápido porque você o escreve no Fortran, mas leva 4 vezes mais tempo para escrevê-lo (sem STL, dificuldade em implementar estruturas de dados complexas etc.), então o Fortran só ganha se você gastar uma fração significativa do seu dia mexendo nos polegares e aguardando o término dos seus cálculos. Dado que, para quase todos nós, o mais valioso é o nosso tempo, a conclusão é a seguinte: use a linguagem que permite desenvolver, depurar e testar seu código o mais rápido possível, por um motivo que ignora que pode ser mais lento do que talvez seja possível se você escreveu em Fortran.
fonte
Minha abordagem foi usar C ++ para tudo, exceto os kernels computacionais, que geralmente são melhores escritos em assembly; isso compra todo o desempenho da abordagem tradicional do HPC, mas permite simplificar a interface, por exemplo, sobrecarregando os kernels computacionais como SGEMM / DGEMM / CGEMM / ZGEMM em uma rotina única, diz Gemm. Claramente, o nível de abstração pode ser muito mais alto, evitando ponteiros brutos e alternando para classes opacas, mas é um bom primeiro passo.
Eu acho que a maior desvantagem do C ++ é o aumento do tempo de compilação, mas, na minha experiência, as economias no tempo de desenvolvimento mais do que compensam isso. Outra desvantagem é que os compiladores C ++ do fornecedor tendem a ter mais erros do que os compiladores C e Fortran do fornecedor. No ano passado, acho que encontrei quase dez erros nos compiladores C ++.
Com tudo isso dito, acho que a destruição de pacotes científicos escritos em linguagens de baixo nível (e o Fortran) é a relutância em expor interfaces convenientes para estruturas de dados sofisticadas: a maioria das pessoas está satisfeita com a interface do Fortran BLAS, pois exige apenas ponteiros e dimensões principais para descrever matrizes, mas poucas pessoas argumentariam que a interface comum do solucionador esparso-direto Fortran, com 40 números inteiros, é algo próximo de conveniente (cf. UHM, SuperLU, PETSc e Trilinos).
Em resumo, defendo o uso de assembly para kernels computacionais de baixo nível, mas linguagens de nível superior para todo o resto, especialmente ao operar em estruturas de dados não triviais.
fonte
Como sou novo aqui, estava pesquisando questões antigas e encontrei essa. Espero que não seja um tabu responder aos antigos!
Como ninguém mais mencionou isso, imaginei que sim. O Fortran 2003 é quase totalmente suportado pela maioria dos principais compiladores (intel, ibm, cray, NAG, PCG) e até o gcc com a mais recente versão 4.7 (futura). O Fortran 2003 (e 2008) é uma linguagem orientada a objetos, embora um pouco mais detalhada que o C ++. Uma das coisas que eu acho legal em Fortran é o fato de o comitê padrão ver a computação científica como seu público principal (agradeço a Damian Rouson por apontar isso para mim outro dia).
Trago tudo isso não para que os programadores de C ++ se tornem programadores do Fortran, mas para que as pessoas do Fortran saibam que agora têm mais opções além de mudar para C ++ ou emular conceitos orientados a objetos no Fortran 90/95.
Uma ressalva que acrescentarei é que existe um custo em estar no limite do que é implementado nos compiladores. Se você realizar um grande projeto no Fortran 2003 agora, encontrará erros e precisará atualizar continuamente o seu compilador (especialmente se você usa o gcc), embora isso tenha melhorado significativamente nos últimos meses!
fonte
O problema com o C ++ é que você tem inúmeras chances de prejudicar o desempenho, por exemplo, usando cegamente o STL, exceções, classes (sobrecarga virtual mais problemas de alinhamento), sobrecarga do operador (novo / exclusões redundantes) ou modelos (compilação sem fim e erros enigmáticos parece benigno, mas você pode perder horas dessa maneira).
No entanto, quanto mais você obtém melhor acesso às bibliotecas gerais e possivelmente maior visibilidade do seu código (embora isso dependa fortemente do campo e você ainda tenha C puro). E você ainda pode compensar a falta de flexibilidade do Fortran envolvendo seu código em uma linguagem de script como R, Lush, Matlab / Scilab ou até Python, Ruby ou Lua.
fonte
Três fatos:
Matrizes n-dimensionais no estilo F77 em C: não há problema em usar o CnD (um plug descarado, é certo)
O sistema de módulos da F90 é mal projetado e hostil para construir ambientes. (O nome de um módulo não precisa corresponder ao nome do arquivo, por exemplo)
Uma impressão pessoal:
transfer()
, aqui vamos nós)fonte
O Fortran é otimizado para cálculos de matriz / matriz e é um trabalho minucioso trabalhar com qualquer tipo de análise de texto. C e C ++ podem não corresponder ao Fortran na computação numérica (está próximo), mas acho muito mais fácil processar texto e organizar dados (ou seja, estruturas de dados personalizadas) com C / C ++.
Como outros já mencionaram, não conte com linguagens interpretadas dinâmicas (Python et al). Eles podem não oferecer a velocidade de fusão do Fortan na frente, mas permitem que você se concentre mais em resolver seu problema computacional do que em todos os detalhes da implementação. Geralmente, você pode implementar uma solução em Python e, se o desempenho for inaceitável, faça alguns perfis, identifique as áreas problemáticas e otimize esse código usando o Cython ou reimplemente o programa inteiro em uma linguagem compilada. Uma vez que você tenha desenvolvido a lógica de solução de problemas, o resto será apenas implementação e, com um bom entendimento dos fundamentos da computação, deve ser fácil representar em qualquer variedade de linguagens de programação.
fonte
Atualmente, estou trabalhando em um dos laboratórios nacionais. A maioria das pessoas ao meu redor são engenheiros mecânicos. Conversando com algumas pessoas dos grupos HPC, eles estão usando principalmente Linux e principalmente C ++. Atualmente, o grupo em que faço parte principalmente de aplicativos de desktop e usamos o Windows em ordem decrescente: C #, FORTRAN, Python, VBA e VB (6, não .NET). Alguns dos mecanismos de simulação que usamos foram escritos em outros laboratórios nacionais do FORTRAN.
fonte
Desculpe por desenterrar um tópico antigo, mas parece que mesmo em 2015, o Fortran está sendo muito usado.
Acabei de encontrar esta lista ( link alternativo ), que basicamente é uma lista de 13 códigos aprovados pelo mecanismo OCLF do DOE para rodar na máquina Summit 300-petaFLOPS, que será disponibilizada aos pesquisadores em 2018. Tentei encontrar o idioma principal usado para o código (com base em uma pesquisa rápida no google) e aqui está o que eu encontrei:
Assim, dos 13 códigos, pelo menos 10 (com base na minha pesquisa rápida) parecem estar escritos em Fortran. Nada mal para um idioma de 50 anos.
NOTA: Estou ciente de que as comparações de idiomas são inúteis, mas, considerando o número de pessoas (especialmente usuários de C ++) que falam mal do Fortran, pensei que valeria a pena mencioná-lo.
fonte
O que Jack P. acho que está tentando dizer é que você deve misturar e combinar. Um bom software é cuidadosamente estratificado. Camadas diferentes podem ser mapeadas de maneira mais natural ou eficiente para diferentes idiomas. Você deve escolher o idioma mais apropriado para cada camada. Você também deve entender como os idiomas podem interoperar, o que pode afetar o idioma escolhido para qual camada.
Uma pergunta melhor é quais exemplos de software de excelente design existem por aí que valem a pena ser estudados para aprender sobre como projetar software em camadas.
fonte