Um amigo da academia me pediu conselhos (sou desenvolvedor de aplicativos de negócios em C #).
Ele tem uma base de código legada que ele escreveu em Fortran na área de imagens médicas. Faz uma enorme quantidade de trituração de números usando vetores. Ele usa um cluster (30 núcleos) e agora foi para uma única estação de trabalho com 500 GPUS nele.
No entanto, para onde ir em seguida com a base de código, então:
- Outras pessoas podem mantê-lo nos próximos 10 anos
- Acelere o ajuste do software
- Pode ser executado em diferentes infraestruturas sem recompilar
Depois de algumas pesquisas minhas (esta é uma área super interessante), algumas opções são:
- Use Python e CUDA da Nvidia
- Reescreva em uma linguagem funcional. Por exemplo, F # ou Haskell
- Acesse a nuvem e use algo como Hadoop e Java
- Learn C
Qual tem sido sua experiência com isso? O que meu amigo deveria procurar para modernizar sua base de código?
ATUALIZAÇÃO: Obrigado @ Mark e todos que responderam. O motivo pelo qual meu amigo está fazendo essa pergunta é que é um momento perfeito no ciclo de vida dos projetos para fazer uma revisão. A atualização dos assistentes de pesquisa no Fortran leva tempo (eu gosto de C # e, especialmente, das ferramentas e não consigo imaginar voltar para os idiomas mais antigos !!)
Gostei da sugestão de manter o número puro de trituração no Fortran, mas envolvê-lo em algo mais novo. Talvez o Python pareça estar ganhando força na academia como uma linguagem de programação de uso geral que é bastante fácil de entender.
Consulte Medical Imaging e um cara que escreveu um invólucro Fortran para a CUDA. Posso publicar legalmente meus invólucros Fortran 90 na biblioteca CUFFT da Nvidias (do CUDA SDK)? .
Respostas:
As demandas que você colocou realmente colocaram o Fortran no topo da lista, para problemas como este:
a) processamento de números
b) paralelamente
c) era e ainda é a linguagem de fato ensinada fora dos estudos de cs (para engenheiros que não são programadores profissionais).
d) tem um apoio incrível da indústria (!), número de compiladores de nível industrial, com nenhum dos fornecedores mostrando menos sinais de abandonar esse ramo. Um dos representantes da Intel, há pouco tempo, revelou que as vendas de seus produtos Fortran são maiores do que qualquer outro em suas ferramentas de desenvolvimento.
É também uma linguagem incrivelmente fácil de entender. Não concordo que leve tempo para levar assistentes de pesquisa atualizados. Meu primeiro livro não tinha mais do que, oh, eu não sei, 30 (?) Páginas de texto esparso impresso. É uma linguagem na qual, depois de aprender 10 palavras-chave, é possível escrever programas de tamanho médio. Ousaria dizer que essas 30 páginas escritas no texto padrão do Word tornariam um "manual Fortran" mais abrangente do que a maioria dos usuários.
Se você estiver interessado em CUDA, convém verificar o compilador do Portland Group , que o suporta . Não estou familiarizado com os detalhes, mas as pessoas geralmente falam disso com elogios.
Além disso, para programas paralelos, você tem OpenMP, MPI e agora as próximas (e muito esperadas) co-matrizes, que o compilador da Intel implementou recentemente . Para não desperdiçar palavras, o Fortran possui uma gama muito fina de "bibliotecas" para programas paralelos.
As bibliotecas numéricas padrão do setor são desenvolvidas para isso, principalmente, outros idiomas seguindo mais ou menos o portfólio de funções / rotinas.
Tudo o que foi dito, no entanto, (depende de quando foi originalmente escrito), recomendo se for, digamos, código F77 ou mais antigo, reescrevendo-o parcialmente ao longo do tempo para dialetos mais recentes - F90 pelo menos, se possível com os recursos do F2003. Um artigo / tese sobre esse tópico foi publicado recentemente (arquivo PDF de tamanho médio). Isso não apenas pode, se feito adequadamente, garantir a portabilidade em várias plataformas, mas também facilitará a manutenção futura.
ps No que diz respeito à "manutenção futura", apenas uma anedota que às vezes gosto de mencionar. Enquanto escrevia minha tese, reutilizei algum código do meu mentor, escrito há 35 anos. Ele foi compilado com apenas um erro; falta uma declaração no final devido a um erro de copiar e colar :)
@DaveMateer (resposta ao comentário) - Vou fazer um comentário a seguir que pode ser um pouco indelicado, mas por favor, não tome o caminho errado, pois está nas intenções justas.
Parece-me que você está enfrentando esse "problema" de maneira errada. O que quero dizer com alguns pontos breves (pois é muito tarde aqui e minha capacidade de criar sentenças legíveis (e muito menos compreensíveis) me deixa depois das 22h)
a) você mencionou que está tentando minimizar o tempo extra de codificação, mas está pensando em reescrever de um idioma especializado para computação numérica para outro de uma escolha colorida de idiomas , se você perdoar minha expressão
(não gostaria de desmotivá-lo, mas, para ser justo, ninguém era realmente Com certeza, o que esse termo representa, menos um exemplo de aplicação bem-sucedida. A maioria das pessoas concorda que existe potencial, mas até agora estão felizes com a forma como as coisas funcionam no momento.). Muitos problemas também não são adequados para esse tipo de paralelização.
b) quais seriam os custos dessa reescrita? pessoas / horas.
c) - versões corretas das bibliotecas para compilar ... - é um problema em qualquer idioma, que não pode ser evitado, por mais que você olhe para ele.
d) Ouvi falar de Python (uma linguagem legal, na verdade) usada em aplicações paralelas em algumas ocasiões, mas sua penetração nesse mercado ainda não parece estar aumentando, e sua natureza em constante mudança o torna uma escolha muito ruim para um projeto de longo prazo (pense em compatibilidade com versões anteriores). Algumas pessoas gostam muito de uma linguagem de "cola".
Ugh, se eu pensar em outra coisa, vou adicionar amanhã. Tenho que dormir um pouco ...
fonte
Duvido que o Fortran algum dia morra - ele possui um legado tão grande de software e bibliotecas, que as pessoas ainda estão trabalhando nele, apenas estabilizando essa situação. Além disso, ainda é uma linguagem muito boa se você não quiser fazer nada além da trituração de números - a sintaxe é muito elegante e lógica, e o compilador pode facilmente adivinhar o que está acontecendo. Assim, é garantido que qualquer nova tecnologia de acelerador de hardware suporte C, Fortran e algum tipo de OpenCL (quando finalmente convergir para algo sólido).
Então, eu diria que você deve separar claramente a parte numérica, deixá-la no Fortran, fazer uma ligação clara e escrever o restante da maneira que desejar.
fonte
O Python está realmente ganhando muita força na comunidade científica da computação (para uma visão um pouco desatualizada, consulte o volume 9, número 3 do CiSE ). Eu acho que um híbrido Python / Fortran é um excelente caminho a percorrer. Para tirar proveito de todas essas GPUs, você pode usar PyCUDA ou PyOpenCL .
Eu sou um matemático que analisa e escreve solucionadores numéricos para equações diferenciais parciais. Estive recentemente em uma situação semelhante à de seu amigo; o código Fortran 77 em questão é o conhecido software Clawpack . Reescrevemos o código de nível superior (todas as partes que não precisam ser rápidas) no Python e usamos o f2py para agrupar automaticamente as partes de baixo nível.
O resultado realmente poderoso disso é que conseguimos conectar quase trivialmente o código híbrido Python / Fortran (apelidado PyClaw ) à biblioteca paralela PETSc, criando pela primeira vez uma versão paralela escalável do Clawpack com bom desempenho em núcleos de 65K. Todo o código paralelo que tivemos que escrever está contido em menos de 300 linhas de Python . Agora estamos resolvendo problemas que não poderiam ter sido resolvidos apenas com o código legado. Tão importante quanto agora, agora é muito mais fácil para os novos usuários escolherem o código, já que o Python é uma linguagem tão amigável e quase tudo pode ser modificado no tempo de execução, em vez do tempo de compilação.
Se você quiser ver mais detalhes de nossa abordagem e resultados, temos um artigo sobre o arXiv .
Desculpas pelo autopromoção, mas parecia que minha experiência pessoal seria relevante aqui. Se você quiser ouvir muitas outras idéias, também poderá postar isso no novo http://scicomp.stackexchange.com .
fonte
Atualmente, estou em uma situação muito semelhante à do seu amigo. Também estou desesperado para "modernizar" meu código legado KLOC Fortran-77, de 40 e poucos anos. E, apesar de Fortran ainda ser considerado o rei em aplicações de processamento de números, eu gostaria de dizer que nem tudo está perdido. (O que se segue é discurso retórico, então tenha paciência comigo).
O fato de o Fortran ser a melhor linguagem para o código numérico não significa que temos que carregar essa bagagem enorme de um código complicado e complicado conosco o tempo todo (sim, um código do Fortran provavelmente ficará bagunçado, especialmente o Fortran-77, que é um linguagem que literalmente não respeita a engenharia de software, quando cruza um determinado KLOCs). Aqueles que defendem o Fortran pela trituração de números esquecem a observação geral de que, quando você faz uma análise de desempenho desses códigos, apenas 5% ou 10% do código é intensivo em desempenho e os 90% restantes + o Fortran é uma sobrecarga inútil, apenas lá para tornar sua vida como "engenheiro de software" um inferno.
Quando você está migrando do Fortran-77 para o Fortran-90, está essencialmente disposto a trocar o desempenho com os recursos do idioma até certo ponto. O Fortran é um poderoso triturador de números, principalmente por causa do Fortran-77. Você pode dizer que o Fortran-90 é tão rápido, mas o tipo de problemas de otimização que os criadores de compiladores tiveram que lidar ao adicionar recursos do Fortran-90/2003 e ainda manter o desempenho do Fortran-77 não são muito diferentes dos problemas que os escritores de compiladores C tiveram que lidar com (e, como resultado, C também é considerado rápido, sem mencionar que C também permite montagem em linha). Então, por que não começar a adicionar o código C pouco a pouco (em vez do Fortran-90) em um código Fortran-77. Meu código já possui partes em C e partes no Fortran-77 e funciona muito bem, sujeito a alguns problemas, como passagem de strings, indexação zero / indexação única etc. Mas a vantagem que eu tenho de C,
Eu daria um passo adiante. Mesmo o C (e definitivamente o Fortran-90/95/2003) é de nível muito baixo se você deseja uma boa interface "humana" para um código de processamento de números. Estou pensando em mudar para um híbrido Python-Fortran-77 ou Python-C. Um código no qual 90% do código é Python (incluindo Numpy, Scipy, plotabilidade e toda essa doçura) e apenas o desempenho intensivo de 5% a 10% permanece como o código Fortran-77 ou C.
fonte
Atualmente, estou no processo de atualizar uma base de código antiga do FORTRAN95 para ser usada em ambientes industriais modernos, pois a versão anterior será executada apenas em máquinas Windows2000 o mais tardar. A própria base de código FORTRAN realiza uma grande quantidade de processamento de número envolvido nas simulações de irrigação.
Então, o que estou fazendo é, em vez de reescrever o FORTRAN em uma linguagem mais moderna, estou simplesmente usando um compilador comercial chamado Silverfrost FTN95 para compilar a base de código do FORTRAN em uma biblioteca .Net 4.0 que estou usando como back-end de um aplicativo WPF . Dessa forma, não corro o risco de inserir bugs conhecidos no código de simulação e estou modernizando-o movendo a base de código para a estrutura .Net 4.0 para que funcione em ambientes mais modernos.
Mas, dependendo do tamanho da sua simulação, você pode simplesmente reescrever a coisa toda em uma linguagem mais moderna, como C #, eu mesmo planejo fazer isso quando tiver uma versão em execução da simulação para comparar a saída.
Espero que minha experiência ajude, obrigado, Alex.
fonte
Fui líder de desenvolvimento em um projeto de 2001 a 2003, que portou um aplicativo do Windows 100KLOC de FORTRAN para C #. Era um aplicativo de processamento de números que tinha suas próprias ligações de GUI personalizadas para bibliotecas Win32. A porta para C # e WinForms simplificou muito o gerenciamento do código e proporcionou a todos um ambiente de desenvolvimento mais rico no Visual Studio. Houve bastante resistência cedo (especialmente em termos de declarações de formato), mas no final definitivamente valeu a pena.
Na minha opinião, faz sentido morder a bala e se livrar da quantidade máxima possível de código FORTRAN. A velocidade nunca foi um problema - os testes iniciais executando o código em C # comparado ao FORTRAN consideraram a diferença de desempenho insignificante, mesmo que o C # esteja executando o código gerenciado. Suas necessidades com vetores podem ser um pouco diferentes, no entanto, e ter uma quantidade minoritária de código FORTRAN restante também seria aceitável.
Outro motivo para isso é a disponibilidade a longo prazo de pessoas com experiência no FORTRAN que podem manter seu código em comparação com os desenvolvedores de C #. Além disso, ajuda o moral da equipe a trabalhar em um idioma moderno e bem suportado.
fonte
Foi-me dito que em muitos contextos, o MATLAB está substituindo o FORTRAN por aplicativos de computação científica. Não é apenas moderno e de alto nível, mas também muito rápido no que faz. Muitos desenvolvedores que trabalham no software de imagens médicas já usam o MATLAB, por isso possuem várias bibliotecas dedicadas à imagem médica. Isso significa que você encontrará ferramentas e suporte especializado em domínio se for com o MATLAB.
fonte