C ++ vs Fortran para HPC


56

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.


12
Uma mistura de uma linguagem de alto e baixo nível é melhor do que usar exclusivamente, na minha opinião. Por exemplo, eu uso Python + C ++.
Faheem Mitha 08/12/11

2
As respostas a esta pergunta serão quase puramente subjetivas e, portanto, não tenho certeza de que essa pergunta seja apropriada.
23413 Jeff Jeff

Respostas:


62

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!


17
"Lembre-se sempre de que seu tempo é mais valioso que o tempo da CPU!" Como alguém que trabalha no HPC, eu discordo dessa parte; tudo o resto está no local.
Levi Morrison

19
"Lembre-se sempre de que seu tempo é mais valioso que o tempo da CPU!" Como alguém que trabalha em pesquisa científica, eu não poderia concordar mais com essa parte.
Decvalts

3
"Lembre-se sempre de que seu tempo é mais valioso que o tempo da CPU!" - Gostaria de colocar meus 2 centavos - usar várias centenas de nós, cada um com mais de 10 núcleos para executar algum programa por várias semanas, pode ser interpretado como um desperdício horrível de um recurso precioso, se mais algumas semanas produzirem um código que é executado em apenas alguns dias. Esses clusters de HPC são um recurso comum raro e caro.
Dani_l

"Lembre-se sempre de que seu tempo é mais valioso do que o tempo da CPU!", Codifique por uma semana, mas corra por um mês, este é um senhor bastante comum!
fronthem 10/03/16

6
"Lembre-se sempre de que seu tempo é mais valioso que o tempo de CPU!", Prefiro codificar por um mês e executar em uma semana! - mais pode ser feito depois que o código for escrito e outros acharão o código que você escreve mais útil também.
Charles

37

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.


11
Um para a primeira resposta sendo equilibrada. Eu acho que C ++ e Fortran não são de longe as únicas possibilidades no HPC contemporâneo. Eu acho que é bom conhecer a força e os pontos fracos quando você decide pelo Fortran, C ++ ou Python (ou o que quiser). Vi 20.000 linhas de Fortran em um único arquivo, cultivadas organicamente ao longo de algumas décadas. Pessoalmente, eu não usaria para outra coisa senão a computação de matriz pesada isolada. Nem mesmo para qualquer coisa relacionada à saída. Até agora, para um comentário tendencioso.
shuhalo

6
Eu não poderia discordar mais dessa resposta. Nosso código de elemento finito não teria sido possível escrever no Fortran. De fato, começou há 15 anos como uma mistura de C simples e Fortran (o último sendo para as partes numericamente intensivas do método), e gradualmente passou para C puro e depois para C ++ ao longo de vários anos. O código ficou consistentemente mais curto, mais rápido e mais fácil de entender, e era mais capaz após cada iteração. Concordo com outras pessoas que apontam que o C ++ oferece muita corda para você se atirar. Escolha o idioma com o qual você se sinta mais confortável.
Bill Barth

6
Bill, você usou o Fortran moderno (90 e adições posteriores?). Isso é muito importante (eu deveria ter sido mais explícito na minha resposta sobre isso). Obviamente, "20.000 linhas de Fortran" ou f77 geralmente não são melhores do que C ++ bem escrito.
Ondřej Čertík

11
@ OndřejČertík: Eu acho que se você acredita que os programas modernos de elementos finitos usam estruturas de dados "simples", então você não viu nenhuma delas recentemente. Tente implementar elementos finitos adaptativos, métodos hp ou multigrid em malhas não estruturadas usando estruturas de dados simples. Bill está no local e acredito que posso falar por ele dizendo que o uso do "Fortran moderno" teria feito pouco mais que uma pequena diferença.
Wolfgang Bangerth 24/03/12

6
@WolfgangBangerth, veja, por exemplo, Phaml ( math.nist.gov/phaml ) para uma implementação Fortran de praticamente tudo o que você mencionou.
Ondřej Čertík

31

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:

  • Você vai escrever o melhor código que você pode na língua que você sabe melhor.
  • Não há diferença na qualidade do código produzido por dois compiladores que usam o mesmo back-end - somos nós que escrevemos códigos incorretos em um idioma ou outro.
  • Apesar de parecer um nível mais baixo, o Fortran é uma abstração de alto nível e não permite acessar diretamente certos recursos de hardware / sistema operacional, como SIMD, threads, redes, etc.

5
Boa resposta. Eu não acho que seu comentário final seja necessariamente verdadeiro. Sou programador C, mas você obtém acesso a coisas de baixo nível no Fortran por meio de boas práticas de programação. A maneira ideal de utilizar coisas como as operações SIMD é escrever código que o sugere fortemente (bloquear loops, por exemplo) e deixar o compilador fazer isso por você. Para threading, basta usar o openMP (pthreads também é utilizável com algum trabalho extra). O Fortran tem todas as coisas que você menciona, apenas em um nível que é importante para o usuário típico: numérico.
precisa saber é o seguinte

@ Reid.Atcheson: Bem, se você bloquear tudo para que o compilador o pegue, ele funcionará automaticamente em C e no Fortran. O problema é, porém, até onde você deseja confiar no seu compilador? E por que você quer confiar nos casos em que sabe exatamente o que deseja fazer? O OpenMP faz threading, sim, mas em termos de bloco. Você pode enganá-lo para obter diferentes pools de threads para fazer coisas diferentes, mas isso é apenas usar mal o OpenMP. Pthreads para Fortran são apenas wrappers para as funções C. Concordo, no entanto, que Fortran é mais fácil se você não estiver interessado nos detalhes.
Pedro

11
Claro que você não terá a máxima eficiência de 99% de pico contando com o compilador, mas você pode facilmente chegar bem perto. Além disso, você precisa usar o ASM intrínseco ou embutido. Você precisa fazer concessões em algum lugar para obter a eficiência geral do programador, é por isso que as linguagens de programação existem em primeiro lugar. Na fase em que você é realmente louco o suficiente para entrar em detalhes de intrínseca ou ASM (já estive algumas vezes), Fortran não é uma muleta. Você saberia como vincular seu código otimizado à mão montado de qualquer maneira.
precisa saber é o seguinte

@ Reid.Atcheson: Bem, eu diria que, para aplicativos HPC paralelos, você pode acabar bem abaixo de 99% de eficiência máxima ... E os tipos de vetor gcc tornam o uso intrínseco um problema não :) :)
Pedro

11
@Pedro, publicação brilhante. Absolutamente brilhante. Muito obrigado pela postagem. Apenas o encontrei enquanto vasculhava aleatoriamente tópicos interessantes.
Inquérito

16

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.


13

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.

y:=αx+y


2
Por que você não confiaria em um compilador C padrão com a otimização apropriada ativada com o objetivo de compilar kernels pequenos? Nesse nível de tamanho e complexidade do código, a diferença no que um compilador poderia extrair dele não é clara.
Peter Brune

11
Conversei com várias pessoas que me disseram que, mesmo com o uso restrito apropriado, o Fortran ainda era mais rápido que o código C e / ou C ++ para algumas operações, como uma transposição explícita de matriz. Não estou dizendo que é impossível tornar o código C ou C ++ tão rápido, mas que o compilador Fortran tende a fazer um trabalho melhor.
Jack Poulson

Eu tenho a mesma experiência com a palavra-chave "restringir" (meu código Fortran simples sempre foi um pouco mais rápido). Mas minha experiência é limitada e simplesmente não tenho tempo para investir na compreensão do assembly gerado pelo gcc. Então, eu simplesmente uso o Fortran, é simples e rápido.
Ondřej Čertík

@JackPoulson: O argumento do compilador é algo que ouço bastante da comunidade Fortran. Infelizmente, a maioria dos compiladores, por exemplo, gcc ou ifc / icc, usa front-ends de idiomas diferentes para o mesmo back-end. O maquinário que realiza a otimização e a geração de código é idêntico e, portanto, as diferenças nos resultados são provavelmente devidas a diferenças na familiaridade do programador com a linguagem subjacente ... #
Pedro

11
Apenas para dar uma pequena perspectiva da afirmação frequentemente repetida e raramente validada de que o Fortran é mais rápido nos núcleos numéricos: Há algum tempo, percebemos que o vetor de matriz esparso se multiplica no pacote Epetra da Trilinos era 30% mais lento que o do acordo.II. O primeiro foi escrito em Fortran 77 direto, o segundo em C direto, sem o uso de 'restringir'. Ambos tinham entre 10 e 15 linhas de código. Hoje, Trilinos usa o código extraído do acordo.II. Tenho certeza de que podemos encontrar muitos casos em que F77 é mais rápido que C. O ponto é que isso não é universalmente hoje.
Wolfgang Bangerth

8

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!


7

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.


11
Geralmente, é uma má idéia aplicar técnicas de baixo nível em idiomas de alto nível. Por exemplo, o STL foi projetado para operar em um nível muito abstrato. É preciso estar ciente para o que a interface foi projetada, usá-la para esta tarefa e depois sair do caminho dos compiladores.
shuhalo

2
Eu acho que os pontos de mbq e Martin são injustos. Sim, existem maneiras de se acertar no pé se você tentar implementar um vetor numérico para fins de álgebra linear usando std :: list <double>. Mas esse é um argumento bobo: pelo menos o C ++ tem uma classe de lista vinculada que você pode usar, enquanto o Fortran não. É como dizer: "Os carros dirigem a uma velocidade tão alta que você pode colidir com uma parede e se machucar; você deve usar carruagens puxadas a cavalo". É apenas uma idéia tola de jogar fora uma linguagem de alto nível que também suporta coisas de baixo nível (por exemplo, C ++) por ter recursos de alto nível.
Wolfgang Bangerth 23/03

@WolfgangBangerth Não, agora você está ferindo Fortran - é tão "de baixo nível" quanto as bactérias são "menos evoluídas" que os humanos. Se você quer uma analogia de carro, deve ser mais como "você pode usar o Jeep e o Lexus para atravessar um caminho pantanoso, mas usar o primeiro dói menos".
23312 mbq

11
Eu aprecio a sua opinião, mas eu manter essa Fortran não é tão evoluído como C ++ é :-)
Wolfgang Bangerth

7

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)

  • O Fortran não suporta bem a refatoração. Para extrair um pouco de funcionalidade de uma função, você deve tocar em quatro lugares: código real, declarações de variáveis, declarações de argumentos e lista de argumentos. C se dá bem com dois lugares para tocar. Isso agrava o efeito da falha em gerenciar bem os dados (descritos abaixo): Como a modularidade em pequena escala é tão dolorosa, quase todo mundo escreve sub-rotinas gigantescas.

Uma impressão pessoal:

  • O Fortran não funciona bem para gerenciar dados. Tente retornar um ponteiro para uma estrutura de dados opaca do usuário em F77 ou F90. ( transfer(), aqui vamos nós)

Oi Andreas! O CnD é interessante, eu não sabia disso. Ah, você escreveu. :) (f90 também suporta fatiamento, alocável para matrizes e, mais importante - sintaxe de matriz para multiplicação, adição e assim por diante.) Eu uso o CMake com o Fortran e funciona muito bem com os módulos. O que exatamente é "lista de argumentos"? Eu não acho que eu uso isso, então apenas 3 lugares são necessários para modificar. Em C, você normalmente precisa modificar o código, os parâmetros e um arquivo de cabeçalho, portanto, são 3 lugares (definitivamente em C ++). Sim, transfer () não é super legal, mas normalmente você não precisa disso na prática.
Ondřej Čertík

3
A refatoração do fortran moderno é trivial com IDEs apropriados, como Photran no eclipse.

2
"O nome de um módulo não precisa corresponder ao seu nome de arquivo, por exemplo" Você deve estar brincando, pode ter muitos módulos em um arquivo. Alguns deles abrangem apenas algumas linhas. Eles são muito mais fáceis de criar se você não precisar criar um arquivo para cada um deles.
Vladimir F

11
Só queria acrescentar o que o @ user389 disse que, embora o Photran seja ótimo e seja o único IDE do Fortran que permita refatorações, seu analisador falha o tempo todo. Por outro lado, não há necessidade de comentar o fato de o Eclipse ter muita memória.
astrojuanlu

5

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.


Está certo. Para análise de texto, também uso o Python.
Ondřej Čertík

Você também pode implementar parte de um script Python em uma linguagem compilada por exemplo, C ++ e ligá-lo em, por exemplo impulsionar Python, Swig etc.
Faheem Mitha

4

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.


4

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:

XGC Fortran

SPECFEM Fortran

ACME Fortran (Bunch of climate codes)

DIRAC Fortran (Mostly)

FLASH Fortran

GTC Fortran

HACC C/C++

LS-DALTON Fortran (some C)

NAMD C/C++

NUCCOR Fortran

NWCHEM Fortran

QMCPACK C++

RAPTOR Fortran

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.


3
Eu discordo, porque minha experiência nos laboratórios nacionais foi, se é que alguma coisa, foi o contrário. A maioria dos novos projetos que vejo em Lawrence Livermore são escritos em C ++ e a maioria das novas (ou ativamente mantidas) bibliotecas de código aberto de última geração em solucionadores de ODE, discretizações FEM e bibliotecas de computação científica de uso geral parece estar em C ou C ++. O Fortran parece ser usado principalmente em projetos que usam bibliotecas existentes / herdadas; Não vejo muitos projetos grandes e novos usando o Fortran, independentemente do que penso sobre o idioma.
amigos estão dizendo sobre

Alguns códigos da teoria funcional da densidade também escritos em Fortran incluem VASP e CASTEP , embora, como @GeoffOxberry aponte, novos projetos talvez tendam a C ++.
precisa saber é o seguinte

@blochwave Como você pode ler no link, os projetos são para uma nova máquina (com aceleradores etc.) que estará online em 2018. Portanto, não é como se eles pegassem um código de 25 anos e o compilassem, na esperança de rodar com bons resultados. desempenho. Tenho certeza de que grande parte dos códigos da lista acima foi ou foi reescrita, como no novo código. Vários códigos climáticos "novos" também estão em Fortran e são usados ​​por muitas agências em vários países.
Stali #

0

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.