Domanda

Ho iniziando a utilizzare Fortran (95) per qualche codice numerico (generando moduli python). Ecco un semplice esempio:

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

Ho trovato che questo comporta molto bene a 32 bit, ma quando compilato come x86_64 Si tratta di circa 5 volte più lento (MacBook Pro Core2Duo, leopardo delle nevi, gfortran 4.2.3 da r.research.att.com). Ho finalmente capito questo potrebbe essere dovuto all'utilizzo 32bit tipo integer invece del tipo nativo, e infatti quando si sostituisce con integer * 8, le prestazioni a 64 bit è solo il 25% peggiore 32bit uno.

Perché utilizzando un intero a 32 bit in modo molto più lento su una macchina a 64 bit? Ci sono delle cast impliciti in corso con l'indicizzazione che potrei non essere a conoscenza?

E 'sempre il caso che a 64 bit sarà più lento rispetto a 32 bit per questo tipo di codice (sono rimasto sorpreso da questo) - o c'è una possibilità ho potuto ottenere la versione compilata a 64 bit in esecuzione la stessa velocità o più veloce?

( questione principale ) Esiste un modo per dichiarare un (intero) variabile per essere il tipo 'native' ... vale a dire 32 bit quando compilato a 32 bit, 64 bit quando compilato a 64 bit in fortran moderno. Senza questo sembra che sia impossibile scrivere codice FORTRAN portatile che non sarà molto più lento a seconda di come la sua compilato - e penso che questo significa che dovrò smettere di usare FORTRAN per il mio progetto. Ho guardato gentile e selected_kind, ma non è stato in grado di trovare tutto ciò che fa questo.

[Modifica:. Il grande calo di prestazioni è stato dal involucro f2py copiare l'array per gettalo via da 64 bit a 32 bit int int, quindi niente inerente al FORTRAN]

È stato utile?

Soluzione

La risposta alla sua 'domanda principale' è quello di selezionare l'opzione del compilatore corretto avere il numero intero di default dichiarato con 32 o 64 bit. Io non uso mai gfortran (io preferisco G95, meglio ancora un compilatore versato per) quindi ho cercato con Google e sembra che -fdefault-intero-8 è l'opzione che vi serve.

Come te sono sorpreso che la versione a 64 bit è più lento rispetto alla versione a 32 bit. Non ho nulla di illuminante su questo punto.

Altri suggerimenti

In realtà hanno anche provato ad utilizzare un 64-bit per eseguire watfor 77 ma la mia era completamente impossible.I ottenuto un gf-FOR-compilatore per il mio 64 bit e provato alcune opzioni su google ans uso successivo dato la possibilità di utilizzare gcc -mp 4.3 e 4.3 gfortran. La versione che era ancora lento. Ti consiglio di utilizzare una macchina a 32 bit, che è Fortran compattabile per eseguire i programmi o de-grade vostra a 64 bit ad una a 32 bit per eseguire le progs più veloci e precisi. Lasciate continuare sulla ricerca in modo da ottenere una macchina a 64 bit runing campactibly con WATFOR77 e subroutine progs.

Anche se non ho fatto studi accurati, non ho visto queste differenze grande velocità.

Io suggerisco di provare una nuova versione di gfortran. La versione 4.2 è precedente (gfortran iniziato con 4.0) e considerato obsoleto. 4.3 e 4.4 sono molto migliorata e avere più funzionalità. 4.4 è la versione corrente non beta. Un modo semplice per ottenerli su un Mac è via MacPorts: i pacchetti gcc43 e gcc44 includono gfortran. I compilatori sono installati come gcc-4.3-mp, gfortran-mp-4.3, ecc, in modo da non entrare in conflitto con le altre versioni. Oppure si può provare l'ultima build di 4.5 dalla pagina wiki gfortran.

Intel Fortran a volte è significativamente più veloce rispetto gfortran.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top