Como uma base de código grande de processamento de números baseada em Fortran pode ser modernizada?

21

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)? .

Dave Mateer
fonte
Eu adicionaria o OpenCL à lista.
Jerry Coffin
3
Olá Dave, existe um certo tipo de "Que idioma devo aprender a seguir?" pergunta que não permitimos aqui, então fiz pequenas revisões para garantir que as pessoas não confundam essa pergunta com isso. Mas você pode expandir sua pergunta para explicar por que as escolhas que você descobriu até agora não são uma boa opção para orientar as respostas para fornecer uma melhor opção?
O que você quer dizer especificamente com "Pode executar em diferentes infra-estruturas sem recompilar"?
Rook
Oi @Idigas - não tenho muita certeza dos detalhes. Mas essencialmente a história foi que, ao levar a base de código para outros clusters / máquinas, estava se tornando um pesadelo obter todas as versões corretas das bibliotecas para compilarem juntas. Acredito que a base de código foi transferida do F77 para o F90 ou qualquer outro. Basicamente, estou tentando ajudá-lo a conversar com as pessoas certas para tomar uma decisão inteligente sobre a alteração de arquiteturas / idiomas. Eu venho de um fundo onde os clientes não gostam de um dia de tempo de codificação extra, então qualquer coisa que posso fazer para me ajudar a escrever o melhor código possível o mais rápido é ideal :-)
Dave Mateer
@DaveMateer - Veja minha resposta (não se encaixou nesta caixa aqui). Vou dormir agora, para futuras respostas pode ser um pouco lento :)
Rook

Respostas:

24

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

  • alguns dos quais não têm suporte para matrizes multidimensionais, entre outras coisas
  • a maioria deles não é adequada para trabalhos numéricos pesados ​​(dos recursos de processamento paralelo de Haskell e Hadoop, admito, não sei nada sobre ... mas nunca os ouvi sequer mencionados nesses círculos)
  • possivelmente foi tentado, mas nunca ouvi falar de uma reescrita do Fortran, um idioma para problemas discretizados, para um idioma funcional
  • recentemente houve uma discussão sobre comp.lang.fortran (tente pesquisar nos grupos do google) sobre os aspectos da computação científica "na nuvem"
    (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 ...

Torre
fonte
@Idigas .. muito apreciado novamente. Concordo totalmente que, quando algo está funcionando, isso significa muito. Nossa indústria está repleta de reescritas que dão terrivelmente mal (Netscape!).
Dave Mateer
1
Idigas tem a idéia certa aqui. Você tem uma base de código em funcionamento que funciona há anos e a sua transcrição irá gerar bugs. Além disso, o Fortran é uma linguagem simples de entender - pode ser feia, mas é feita de conceitos claros. Mantenha as dependências de / para outro código em cheque e talvez escreva uma boa interface de estilo C no Fortran e você achará o código notavelmente à prova de futuro (estilo C, já que quase qualquer outro idioma por aí tem um mecanismo para chamar código com uma interface de estilo C).
anon
2
Tem que concordar. Se você entende a matemática por trás do que está fazendo (e a maioria dos engenheiros faz), implementá-la no FORTRAN não é uma curva de aprendizado muito acentuada. Uma vez criado, os requisitos raramente serão alterados, como acontece nos aplicativos comerciais ou sociais.
21411 JeffO
Uau, eu não sabia que havia tanto amor por FORTRAN. Eu tive que desenvolver no F77 por 5 anos e não suporto a coisa.
precisa saber é o seguinte
2
@dodgy_coder. É bom saber que você desenvolveu o Fortran + .NET nos anos 90. A primeira versão beta do .NET foi
10

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.

mbq
fonte
Sem mencionar que novos projetos em Fortran também são iniciados hoje em dia.
Rook
Sim, Fortran não é COBOL, não é apenas suportado apenas porque é isso que as pessoas aprenderam há 30 anos (embora a IMO faça parte disso). O processamento de números não é o meu forte, portanto, se houver melhor, certamente não o conheço.
Ben Brocka 15/10
1
O idioma fortran ainda tem dez anos de vantagem na trituração de números e otimizações associadas. Não vai morrer tão cedo.
Martin York
1
O artigo apareceu em uma recente "Comunicação da ACM", sobre o Fortran e como ele continua indo e indo com modernizações sucessivas. Manter (pelo menos a parte de processamento de números) o código no Fortran provavelmente seria uma boa jogada. Também ajuda a evitar a síndrome de Netscape (reescrever = novos bugs = enorme tempo de ciclo = irritar todos os envolvidos).
quickly_now
1
Você realmente quer alguém que não esteja interessado no Fortran tocando seu código de processamento de números? Um grande problema é garantir que o resultado ainda seja preciso após uma reescrita.
Peter Smith
4

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 .

David Ketcheson
fonte
1

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.

Yudle Joza
fonte
1
"um código Fortran é obrigado a ser confuso". Não. Um codificador bagunçado escreverá um código bagunçado em qualquer idioma e o inverso será verdadeiro. Kernighan e Plauger mostraram como escrever Fortran limpo anos atrás .
0

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.

Alex Hope O'Connor
fonte
0

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.

dodgy_coder
fonte
0

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.

Oleksi
fonte