Cosa rende veloce Fortran?


41

Fortran occupa un posto speciale nella programmazione numerica. Puoi sicuramente creare software buono e veloce in altre lingue, ma Fortran continua a funzionare molto bene nonostante la sua età. Inoltre, è più facile creare programmi veloci in Fortran. Ho realizzato programmi veloci in C ++, ma devi stare più attento a cose come l'aliasing dei puntatori. Quindi, ci deve essere una ragione per questo, e molto tecnica. È perché il compilatore può ottimizzare di più? Mi piacerebbe davvero conoscere i dettagli tecnici, quindi se uso un'altra lingua posso prendere in considerazione queste cose.

Ad esempio, so, o penso, che una cosa è che lo standard specifica che i puntatori sono contigui nella memoria, il che significa sempre un accesso più veloce alla memoria. Credo che tu possa farlo in C ++ dando un flag al compilatore. In questo modo aiuta a sapere cosa fa Fortran, in modo che se si utilizza un'altra lingua possiamo imitarlo.


7
Direi che questa potrebbe essere una domanda migliore per StackOverflow, anche se penso che sia una buona domanda. Una ricerca rapida ( stackoverflow.com/search?q=fortran+fast ) mi porta a questa domanda che potrebbe esserti utile: stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
Devi specificare quale tipo di fortran stai usando. C'è una differenza sostanziale tra 77 e 90+. Presumo almeno 90 se stiamo parlando di puntatori ...
qubyte

Ho sempre letto che Fortran è più veloce di C. Beh, forse, ma è più veloce del 2% o piuttosto più veloce del 50%?
shuhalo,

4
È un mito urbano. A meno che il compilatore non possa utilizzare istruzioni speciali, è possibile ottimizzare a mano quasi tutti i programmi, indipendentemente dal compilatore, per generare circa lo stesso linguaggio macchina.
Mike Dunlavey

Risposte:


50

I progettisti linguistici affrontano molte scelte. Ken Kennedy ha sottolineato due: (1) astrazioni migliori e (2) codice di livello superiore o inferiore (meno o più simile a una macchina). Mentre linguaggi funzionali come Haskell e Scheme si concentrano sul primo, i linguaggi scientifici tradizionali di calcolo come Fortran e C / C ++ si sono concentrati sul secondo. Dire che una lingua è più veloce di un'altra è di solito fuorviante: ogni lingua ha un dominio problematico per il quale eccelle. Fortran ha tariffe migliori nel dominio dei codici numerici basati su array rispetto ad altre lingue per due ragioni fondamentali: il suo modello di array e la sua esplicitazione.

Modello di array

I programmatori Fortran eseguono in gran parte manipolazioni di array. Per questo, Fortran facilita diverse ottimizzazioni del compilatore che non sono disponibili in altre lingue. L'esempio migliore è la vettorializzazione: la conoscenza del layout dei dati consente al compilatore di invocare elementi intrinseci a livello di assembly sull'array.

Linguaggio esplicito

Anche se sembra che un linguaggio più semplice dovrebbe essere compilato "meglio" di un linguaggio più complesso, non è proprio così. Quando si scrive in un linguaggio assembly , non c'è molto che un compilatore possa fare: tutto ciò che vede sono istruzioni molto dettagliate. Fortran richiede spiegazioni (quindi, più lavoro da parte del programmatore) solo nei casi in cui si ottengono ricompense reali per l'elaborazione basata su array. Fortran utilizza tipi di dati semplici, flusso di controllo di base e spazi dei nomi limitati; al contrario, non dice al computer come caricare i registri (che potrebbe essere necessario per il tempo reale ). Laddove Fortran è esplicito, consente cose come la completa inferenza del tipo, che aiuta i principianti a iniziare. Evita anche una cosa che spesso rallenta il C:puntatori opachi .

Fortran può essere lento

Fortran non è veloce per ogni compito: è per questo che non molte persone lo usano per costruire GUI o anche per elaborazioni scientifiche non strutturate. Una volta che lasci il mondo delle matrici per grafici, alberi decisionali e altri regni, questo vantaggio di velocità scompare rapidamente. Vedi i benchmark del linguaggio del computer per alcuni esempi e numeri.


7
I problemi di GUI / IO possono essere facilmente risolti avvolgendo lo scricchiolio di Fortran in un linguaggio "più generico". Uso spesso R per questo scopo.
mbq,

2
shootout.alioth.debian.org non è più disponibile! E la nuova versione ha molte meno informazioni :(
astrojuanlu,

23

Il design di Fortran consente al compilatore di eseguire ottimizzazioni più forti in alcuni casi, ottimizzazioni che non sono generalmente disponibili per C.

Un esempio famoso è la gestione dell'aliasing . In Fortran, puoi accedere a un'area di memoria specifica solo attraverso il simbolo specifico associato a quell'area di memoria. Questa conoscenza consente al compilatore di utilizzare trucchi intelligenti quando è il momento di memorizzare nella cache: sa se un valore è potenzialmente cambiato o no. Fino a F90, questo è stato verificato facilmente. Quando Fortran 90 fu introdotto pointers, il presupposto non era più vero: si poteva accedere alla stessa area di memoria attraverso due (o più) simboli. Questo è il motivo per cui devi specificare targetagli array che vuoi indirizzare tramite puntatori.

Un altro fatto interessante è che molti costrutti consentono al compilatore di eseguire la parallelizzazione senza l'intervento dell'utente. Tale lusso è possibile grazie al relativo "agnosticismo sulla piattaforma" di Fortran come lingua.

Ci sono molti altri trucchi sottili come questo. Inoltre, ricorda che nessuno usa Fortran oggi, ad eccezione dei calcoli numerici, il che significa che la caratteristica principale e il punto di vendita dei compilatori Fortran è la velocità del codice risultante. Di conseguenza, i fornitori si sono concentrati su questo.

Tuttavia, puoi produrre codice performante anche con altre lingue. Tuttavia, può richiedere cure speciali o interventi umani. Il punto generale, tuttavia, è che le prestazioni non sono un problema fino a quando non c'è un problema, e il tempo dell'uomo è molto più costoso del tempo del computer. Quindi le pratiche di codifica dovrebbero concentrarsi sul risparmio di tempo umano, piuttosto che sul tempo del computer.


2
Quando i tuoi computer raggiungono una gamma> 100 milioni di dollari, il tempo delle persone (studenti laureati) smette di sembrare piuttosto costoso in confronto.
Phil Miller,

6
@Novelocrat: la quantità di codice che gira su un computer da $ 100 milioni è stata scritta da innumerevoli ore lavorative che vanno ben oltre i $ 100 milioni, anche a un prezzo da studente grad. Ricorda che i costi di una persona sono il doppio del suo reddito. Il resto va in tasse e correlate. Inoltre, un computer non si esaurisce. Una persona lo fa e cambierà lavoro.
Stefano Borini,

1
@StefanoBorini Ho una lunga storia di PC con esperienza di burn off ...
N74

1
"Inoltre, ricorda che nessuno usa Fortran oggi, ad eccezione dei calcoli numerici," Fortran = "FORmula TRANslation". Fortran è sempre stato principalmente utilizzato e progettato per calcoli numerici. Fortran ha una grande quantità di tempo per i computer ad alte prestazioni.
user21387

Oggi, come sempre, Fortran viene utilizzato per lo stesso scopo: i calcoli numerici.
sequenza del

12

Non credo che Fortran sia così vicino al metallo (vedi altre risposte) ma tende a ottimizzare molto facilmente. I loop sono semplici e il linguaggio supporta prontamente le estensioni di vettorializzazione (va bene quando l'ho usato nel mio primo lavoro stavamo prendendo di mira una vasta gamma di big iron vettoriali).

C'è anche il grande fattore di inerzia. Un sacco di codice numerico è in Fortran, quindi i costruttori di server di fascia alta e supercomputer si assicurano di scrivere buoni compilatori di Fortran ottimizzanti. I compilatori sono buoni (anche su macchine con una relativa mancanza di compilatori di alta qualità), quindi gli utenti continuano a usare il Fortran e persino a scrivere un nuovo codice al suo interno. Quindi i costruttori si assicurano che la loro prossima generazione abbia buoni compilatori, ecc ...


8

Fai attenzione ai miti urbani qui. Se due compilatori generano lo stesso codice assembly, i programmi risultanti avranno le stesse prestazioni.

Per ogni dato pezzo di logica, esiste un programma in linguaggio assembly che riduce al minimo i tempi di esecuzione. A quel programma non importa quale compilatore lo abbia generato.

Detto questo, esistono linguaggi compilati per semplificare la vita al programmatore. Parte del costo di questo è che possono indurre l'utente a utilizzare funzionalità che non comportano tempi di esecuzione minimi. Il primo esempio di questo ènew in C ++. (Quanto potrebbe essere lento - sono solo tre caratteri?) Praticamente ti implora di allocare la memoria in modo dinamico e non prestare attenzione al costo di runtime. Se è quello che vuoi fare, è fantastico, ma Fortran potrebbe essere più veloce solo perché non ti ha risucchiato nel farlo.

Ma ben oltre, non ho mai visto un programma che, come scritto per la prima volta, non avesse grandi margini di miglioramento delle prestazioni del tipo che il compilatore non avrebbe mai potuto ripulire. Ad esempio, passare una grande parte del tempo a chiamare expe / olog ripetutamente con lo stesso argomento. Come altro esempio, chiamare DGEMM per moltiplicare le matrici e scoprire che gran parte del tempo impiega a chiamare LSAME solo per decifrare i suoi argomenti sui caratteri di input.

Questo è nello stesso momento in cui la gente dice che Fortran è più veloce a causa dell'aliasing del puntatore o dello srotolamento del loop. È come dire che un autobus della Porsche sarebbe sicuramente più veloce di un autobus della Chevrolet. Deve esserci un po 'di buon senso.


4
Non credo sia solo un mito urbano. Il supporto di Fortran per le operazioni dell'intero array, le funzioni PURE / ELEMENTAL, ecc., Può aiutare i compilatori a ottimizzare / vettorizzare o persino a parallelizzare facilmente. Ad esempio, vedi thinkingparallel.com/2007/08/14/… . Quello che fanno i compilatori è una storia diversa (dipende dal fornitore).
Stali,

@stali: dipende da qualcosa in più rispetto al venditore. Dipende dal programma che viene compilato. Ho visto la gente generalizzare da "esiste un programma che Fortran può far funzionare velocemente" a "Fortran è più veloce su qualsiasi programma". Se lo fai notare, le persone possono iniziare a orlare, falciare e spaccare i peli, e ciò che alla fine si riduce, in pratica, non è altro che ciò che la gente vuole pensare.
Mike Dunlavey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.