Pergunta

Eu tenho de começar a usar Fortran (95) por um código numérico (gerando módulos python). Aqui está um exemplo simples:

subroutine bincount (x,c,n,m)
  implicit none
  integer, intent(in) :: n,m
  integer, dimension(0:n-1), intent(in) :: x
  integer, dimension(0:m-1), intent(out) :: c
  integer :: i

  c = 0
  do i = 0, n-1
    c(x(i)) = c(x(i)) + 1 
  end do
end

Descobri que este executa muito bem em 32 bits, mas quando compilado como x86_64, é cerca de 5x mais lento (MacBook Pro Core2Duo, o Snow Leopard, gfortran 4.2.3 do r.research.att.com). Finalmente realizou este pode ser devido à utilização de 32 bits tipo inteiro em vez do tipo nativo, e, na verdade, quando eu substituir por inteiro * 8, o desempenho de 64 bits é de apenas 25% pior do que a de 32 bits.

Por que está usando um inteiro de 32 bit de modo muito mais lento em uma máquina de 64 bits? Há algum casts implícitas acontecendo com a indexação de que eu poderia não estar ciente de?

É sempre o caso que 64 bits será mais lento do que 32 bit para este tipo de código (Fiquei surpreso com isso) - ou há uma chance que eu poderia começar a versão compilada de 64 bits executando a mesma velocidade ou mais rápido?

( principal questão ) Existe alguma maneira de declarar um (inteiro) variável para ser do tipo 'nativo' ... ou seja, 32 bit quando compilado de 32 bits, 64 bits quando compilado de 64 bits em fortran moderna. Sem isso parece que é impossível escrever código fortran portátil que não vai ser muito mais lento, dependendo de como seu compilado - e eu acho que isso significa que eu terá que parar de usar fortran para o meu projeto. Eu olhei tipo e selected_kind, mas não foi capaz de encontrar qualquer coisa que faz isso.

[Edit: o grande hit desempenho foi do f2py invólucro copiando a matriz para lança-o de 64 bits int de 32 bits int, então nada inerente ao fortran.]

Foi útil?

Solução

A resposta à sua "questão principal é selecionar a opção de compilador corretas para ter o padrão inteiro declarado com 32 ou 64 bits. Eu nunca uso gfortran (eu prefiro g95, melhor ainda um pago para compilador) para que eu Googled e parece que -fdefault-integer-8 é a opção que você precisa.

Como você eu estou surpreso que a versão de 64 bits é mais lento do que a versão de 32 bits. Eu não tenho nada esclarecedor sobre esse ponto.

Outras dicas

realmente tem também tentei usar um 64-bit para executar watfor 77, mas o meu foi completamente impossible.I tem uma gf-FOR-compilador para o meu 64-bit e tentou algumas opções sobre ans Google usa mais tarde dada a opção de uso gcc -MP 4,3 e 4,3 gfortran. Versão que ainda era lento. Vou aconselhá-lo usar uma máquina de 32 bits, que é fortran compactible para executar seus programas ou de grau de seu 64 bits para um de 32 bits para executar seus progs mais rápidos e precisos. Deixe sempre a pesquisar, de modo a obter uma máquina de 64 bits runing campactibly com WATFOR77 e sub-rotinas progs.

Embora eu não tenha feito estudos cuidadosos, eu não vi essas diferenças grande velocidade.

Eu sugiro tentar uma versão mais recente do gfortran. Versão 4.2 é anterior (gfortran começou com 4,0) e considerado obsoleto. 4.3 e 4.4 são muito melhor e têm mais recursos. 4.4 é a versão atual não-beta. Uma maneira fácil de obtê-los em um Mac é via MacPorts: os pacotes gcc43 e gcc44 incluem gfortran. Os compiladores são instalados como gcc-pf-4,3, gfortran-pf-4,3, etc., de modo a não entrar em conflito com outras versões. Ou você pode tentar a compilação mais recente de 4,5 na página wiki gfortran.

Intel Fortran às vezes é significativamente mais rápido do que gfortran.

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