Pergunta

Recentemente, passei a manter uma grande quantidade de código FORTRAN com uso intensivo de cálculos científicos.Estou tendo dificuldades para entender todas as, digamos, nuances de uma linguagem de quarenta anos, apesar do Google e de dois livros de nível introdutório.O código está repleto de "melhorias para melhorar o desempenho".Alguém tem algum guia ou conselho prático para de-otimizando o FORTRAN para os níveis CS 101?Alguém tem conhecimento de como funcionava a otimização do código FORTRAN?Existem 'pegadinhas' típicas do FORTRAN que podem não ocorrer a um desenvolvedor criado em Java/C++/.NET que assume uma base de código FORTRAN 77/90?

Foi útil?

Solução

Você meio que precisa ter uma "sensação" do que os programadores tinham que fazer naquela época.A grande maioria do código com o qual trabalho é mais antigo do que eu e rodava em máquinas que eram "novas" quando meus pais estavam no ensino médio.

Os FORTRAN-ismos comuns com os quais lido, que prejudicam a legibilidade são:

  • Blocos comuns
  • Variáveis ​​implícitas
  • Dois ou três loops DO com instruções CONTINUE compartilhadas
  • GOTO está no lugar dos loops DO
  • Declarações IF aritméticas
  • GOTOs computados
  • Equivalência REAL/INTEGER/outro em algum bloco comum

As estratégias para resolvê-los envolvem:

  1. Pegar Spag/plusFORT, vale o dinheiro gasto, resolve muitos deles automaticamente e Bug Free(tm)
  2. Mude para o Fortran 90 se possível, se não, mude para o Fortran 77 de formato livre
  3. Adicione IMPLICIT NONE a cada sub-rotina e, em seguida, corrija todos os erros de compilação, demorados, mas necessários, alguns programas podem fazer isso automaticamente para você (ou você pode criar um script)
  4. Mover todos os blocos COMUNS para MÓDULOS, fruto mais fácil, vale a pena
  5. Converter instruções aritméticas IF em blocos IF..ELSEIF..ELSE
  6. Converter GOTOs computados em blocos SELECT CASE
  7. Converta todos os loops DO para a sintaxe F90 mais recente

    myloop: do ii = 1, nloops
        ! do something
    enddo myloop
    
  8. Converta membros de bloco comum equivalentes em memória ALLOCÁVEL alocada em um módulo ou em suas rotinas de caracteres verdadeiros se Hollerith estiver sendo armazenado em um REAL

Se você tiver dúvidas mais específicas sobre como realizar algumas tarefas de legibilidade, posso dar um conselho.Eu tenho uma base de código de algumas centenas de milhares de linhas de Fortran que foi escrita ao longo de 40 anos e pela qual sou de alguma forma responsável, então provavelmente já me deparei com quaisquer "problemas" que você possa ter encontrado.

Outras dicas

Caixa de sabão Fortran legada

Eu ajudei a manter/melhorar uma base de código Fortran legada por um bom tempo e na maior parte penso variáveis ​​de seis letras está no dinheiro.Esse conselho, porém, tende para o técnico;uma tarefa mais difícil é a implementação de “boas práticas”.

  • Estabeleça um estilo de codificação necessário e diretrizes de codificação.
  • Exija uma revisão de código (de mais do que apenas o codificador!) Para qualquer coisa enviada à base de código.(O controle de versão deve estar vinculado a este processo.)
  • Comece a construir e executar testes unitários;idem benchmark ou testes de regressão.

Isso pode parecer óbvio hoje em dia, mas correndo o risco de generalizar demais, afirmo que a maioria das lojas de código Fortran tem uma cultura arraigada, algumas começaram antes mesmo de o termo "engenharia de software" existir, e que com o tempo o que passa a dominar é "Faça isso agora".(Isso não é exclusivo das lojas Fortran, de forma alguma.)

Abraçando pegadinhas

Mas o que fazer com uma base de código legado já existente e obsoleta?Concordo com Joel Spolsky em reescrever, não.No entanto, na minha opinião variáveis ​​de seis letras aponta para a exceção permitida: Use ferramentas de software para fazer a transição para construções Fortran melhores. Muita coisa pode ser detectada/corrigida por analisadores de código (VERIFICAR) e reescritores de código (maisFORT).Se você tiver que fazer isso manualmente, certifique-se de ter um motivo urgente.(Eu gostaria de ter em mãos uma referência ao número de bugs de software resultantes da correção de bugs de software, é humilhante.Acho que algumas dessas estatísticas estão em Programação C especializada.)

Provavelmente o melhor ataque para vencer o jogo das pegadinhas do Fortran é ter a melhor defesa:Conhecer bastante bem o idioma.Para promover esse fim, recomendo ...livros!

Biblioteca Fortran Dead Tree

Tive apenas um sucesso modesto como "chamador de controle de qualidade" ao longo dos anos, mas descobri que a educação funciona, às vezes inadvertidamente, e que uma das coisas mais influentes é um livro de referência que alguém tem em mãos.adoro e recomendo

Fortran 90/95 para cientistas e engenheiros, de Stephen J.Chapman

O livro é até bom com o Fortran 77 porque identifica especificamente as construções que não devem ser usadas e fornece as melhores alternativas.No entanto, na verdade é um livro didático e pode perder força quando você realmente deseja conhecer os detalhes do Fortran 95, e é por isso que recomendo

Fortran 90/95, de Michael Metcalf e John K.Reid

como sua referência (sic) para Fortran 95.Esteja avisado que não é a escrita mais lúcida, mas o véu se levantará quando você realmente quiser tirar o máximo proveito de um novo recurso do Fortran 95.

Por focar nas questões de passar do Fortran 77 para o Fortran 90, gostei

Migrando para Fortran 90, por Jim Kerrigan

mas o livro está esgotado.(Eu simplesmente não entendo o uso que O'Reilly faz de Safári, por que nem todos os seus livros esgotados estão disponíveis?)

Por último, quanto ao herdeiro do maravilhoso, maravilhoso clássico, Ferramentas de software, eu nomeio

FORTRAN clássico, de Michael Kupferschmid

Este livro não apenas mostra o que se pode fazer "apenas" com o Fortran 77, mas também fala sobre algumas das questões mais sutis que surgem (por exemplo, se deve ou não usar a declaração EXTERNAL).Este livro não cobre exatamente o mesmo espaço que "Ferramentas de Software", mas são dois dos três livros de programação Fortran que eu classificaria como "divertidos"....(aqui está o terceiro).

Conselhos diversos que se aplicam a quase todo compilador Fortran

  • Há uma opção do compilador para impor o comportamento IMPLICIT NONE, que você pode usar para identificar rotinas problemáticas sem modificá-las primeiro com a declaração IMPLICIT NONE.Este conselho não parecerá significativo até depois da primeira vez que um build fracassa por causa de um comando IMPLICIT NONE inserido em uma rotina legada.(O que?Sua revisão de código não detectou isso?;-)
  • Existe uma opção de compilador para verificação de limites de array, que pode ser útil ao depurar código Fortran 77.
  • Os compiladores Fortran 90 devem ser capazes de compilar quase todo o código Fortran 77 e até mesmo código Fortran mais antigo.Ative as opções de relatório em seu compilador Fortran 90, execute seu código legado por meio dele e você terá um início decente na verificação de sintaxe.Alguns compiladores Fortran 77 comerciais são, na verdade, compiladores Fortran 90 que estão sendo executados no modo Fortran 77, portanto, essa pode ser uma opção relativamente trivial para qualquer script de construção que você tenha.

Há algo na pergunta original que eu gostaria de alertar.Você diz que o código está repleto de "melhorias para melhorar o desempenho".Como os problemas do Fortran são geralmente de natureza científica e matemática, não presuma que esses truques de desempenho existem para melhorar a compilação.Provavelmente não é sobre o idioma.No Fortran, a solução raramente está na eficiência do código em si, mas na matemática subjacente para resolver o problema final.Os truques podem tornar a compilação mais lenta, podem até fazer a lógica parecer confusa, mas a intenção é tornar a solução mais rápida.A menos que você saiba exatamente o que está fazendo e por quê, deixe-o como está.

Mesmo a refatoração simples, como alterar nomes de variáveis ​​que parecem idiotas, pode ser uma grande armadilha.Equações matemáticas historicamente padronizadas em um determinado campo da ciência terão usado uma abreviação específica desde os dias de Maxwell.Portanto, ver uma matriz chamada B(:) em eletromagnetismo informa a todos os engenheiros da Emag exatamente o que está sendo resolvido.Mude isso por sua conta e risco.Moral, conheça a nomenclatura padrão da ciência antes de renomear também.

Como alguém com experiência em FORTRAN (sabor 77, embora já faça um tempo desde que o usei seriamente) e C/C++, o item a ser observado que imediatamente vem à mente são os arrays.Matrizes FORTRAN começam com um índice de 1 em vez de 0, como fazem em C/C++/Java.Além disso, o arranjo da memória é invertido.Portanto, incrementar o primeiro índice fornece locais de memória sequenciais.

Minha esposa ainda usa FORTRAN regularmente e tem alguns códigos C++ com os quais precisa trabalhar, agora que estou prestes a começar a ajudá-la.À medida que surgirem problemas durante sua conversão, tentarei apontá-los.Talvez eles ajudem.

Você poderia explicar o que deve ser feito para manter o código?Você realmente precisa modificar o código?Se você conseguir modificar apenas a interface desse código em vez do código em si, isso seria o melhor.

O problema inerente ao lidar com um grande código científico (não apenas FORTRAN) é que a matemática subjacente e a implementação são complexas.Quase por padrão, a implementação tem que incluem otimização de código, para que seja executado dentro de um prazo razoável.Isso é agravado pelo fato de que muitos códigos nessa área são criados por cientistas/engenheiros especialistas em suas áreas, mas não em desenvolvimento de software.Digamos apenas que "fácil de entender" não é a primeira prioridade para eles (eu fui um deles, ainda aprendendo a ser um desenvolvedor de software melhor).

Devido à natureza do problema, não creio que uma pergunta e resposta geral sejam suficientes para ser útil.Sugiro que você poste uma série de perguntas específicas com um trecho de código anexado.Talvez começando com aquele que lhe dá mais dor de cabeça?

Tenho usado o Fortran a partir da versão '66 desde 1967 (em um IBM 7090 com 32 mil palavras de memória).Usei então o PL/1 por algum tempo, mas depois voltei para o Fortran 95 porque ele é ideal para os problemas de matrizes/números complexos que temos.Gostaria de acrescentar às considerações que grande parte da estrutura complicada dos códigos antigos se deve simplesmente à pequena quantidade de memória disponível, forçando algo como reutilizar algumas linhas de código por meio de cálculos computados ou atribuídos. GOTOS.Outro problema é a otimização através da definição de variáveis ​​auxiliares para cada subexpressão repetida - os compiladores simplesmente não otimizaram para isso.Além disso, não era permitido escrever DO i=1,n+1;você teve que escrever n1=n+1; DO i=1,n1.Em consequência, os códigos antigos estão sobrecarregados com variáveis ​​supérfluas.Quando reescrevi um código em Fortran 95, apenas 10% das variáveis ​​sobreviveram.Se você quiser deixar o código mais legível, recomendo fortemente procurar variáveis ​​que possam ser facilmente eliminadas.

Outra coisa que devo mencionar é que, durante muitos anos, matrizes aritméticas e multidimensionais complexas foram altamente ineficientes.É por isso que muitas vezes você encontra códigos reescritos para fazer cálculos complexos usando apenas variáveis ​​reais e matrizes endereçadas com um único índice linear.

Bem, em certo sentido, você tem sorte, porque o Fortran não tem muitas construções sutis de fluxo de controle, herança ou algo parecido.Por outro lado, ele tem algumas pegadinhas realmente incríveis, como o material de ramificação para rótulo numérico calculado aritmeticamente, as variáveis ​​digitadas implicitamente que não exigem declaração, a falta de palavras-chave verdadeiras.

Não sei sobre as "melhorias para melhorar o desempenho".Eu acho que a maioria deles é provavelmente ineficaz, já que algumas décadas de tecnologia de compiladores tornaram desnecessárias muitas dicas.Infelizmente, você provavelmente terá que deixar as coisas como estão, a menos que esteja planejando fazer uma reescrita massiva.

De qualquer forma, o código central do cálculo científico deve ser bastante legível.Qualquer linguagem de programação que use aritmética infixa seria uma boa preparação para a leitura do código aritmético e de atribuição do Fortran.

Eu adorava FORTRAN, costumava ensinar e programar nele.Só queria incluir isso.Não toco nisso há anos.
Comecei em COBOL, quando mudei para FORTRAN me senti livre.Tudo é relativo, certo?Eu apoiaria o que foi dito acima - reconheça que esta é uma linguagem PROCEDURAL - sem sutilezas - então aceite-a como você a vê.
Provavelmente frustrará você para começar.

Comecei no Fortran IV (WATFIV) em cartões perfurados e meus primeiros anos de trabalho foram VS FORTRAN v1 (IBM, nível Fortran 77).Muitos bons conselhos neste tópico.

Eu acrescentaria que você precisa distinguir entre coisas feitas para fazer a besta funcionar, versus coisas que “otimizam” o código, versus coisas que são mais legíveis e fáceis de manter.Lembro-me de ter lidado com sobreposições VAX ao tentar fazer com que o código de simulação DOE fosse executado na IBM com memória virtual (eles tiveram que ser removidos e tudo se transformou em um espaço de endereço).

Eu certamente começaria reestruturando cuidadosamente as estruturas de controle do FORTRAN IV para pelo menos o nível FORTRAN 77, com recuo e comentários adequados.Tente se livrar de estruturas de controle primitivas como ASSIGN e COMPUTED GOTO e aritmética IF e, claro, de quantos GOTOs você puder (usando IF-THEN-ELSE-ENDIF).Definitivamente use IMPLICIT NONE em todas as rotinas, para forçá-lo a declarar corretamente todas as variáveis ​​(você não acreditaria quantos bugs eu detectei no código de outras pessoas - erros de digitação em nomes de variáveis).Cuidado com as "otimizações prematuras" que é melhor deixar o compilador cuidar sozinho.

Para que esse código continue vivo e possa ser mantido, você deve a si mesmo e a seus sucessores torná-lo legível e compreensível. Apenas tenha certeza do que você está fazendo ao alterar o código! FORTRAN tem muitas construções peculiares que podem facilmente enganar alguém vindo do lado C do mundo da programação.Lembre-se de que o FORTRAN remonta a meados dos anos 50, quando não existia uma ciência da linguagem e do design de compiladores, apenas Ad hoc hackeando algo (desculpe, Dr.B!).

Aqui está outro que me mordeu de vez em quando.Ao trabalhar no código FORTRAN, certifique-se de pular todas as seis colunas iniciais.De vez em quando, só consigo recuar o código cinco espaços e nada funciona.À primeira vista, tudo parece bem e então finalmente percebo que todas as linhas começam na coluna 6 em vez da coluna 7.

Para quem não está familiarizado com FORTRAN, as primeiras 5 colunas são para números de linha (= rótulos), a 6ª coluna é para um caractere de continuação caso você tenha uma linha com mais de 80 caracteres (basta colocar algo aqui e o compilador saberá que esta linha na verdade faz parte do anterior) e o código sempre começa na coluna 7.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top