Fortran: portabilità prestazioni / 64 bit a 32 bit
-
13-09-2019 - |
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]
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.