2010-06-30 15 views
39

Lavoro con apprendimento automatico con set di dati abbastanza grandi (sono ancora in memoria) e ho scritto alcuni calcoli in R, che ritengo troppo lenti. Quindi vorrei sostituire le "parti critiche" del programma con un codice compilato che chiamerei da R. Un problema di esempio che ho in mano sta implementando lo forward-backward algorithm.Devo imparare Fortran o C++ ad estendere R?

La mia domanda è se dovrei imparare Fortran o C++ per fare questo? Ho solo bisogno di lavorare con i vettori numerici o le matrici. Sono principalmente interessato a quale lingua è più facile da imparare e interfaccia da R e non mi interessa davvero quale sia la migliore sul mio CV.

Ho letto il manuale delle estensioni R e ho giocato un po 'con il pacchetto inline con un semplice codice Fortran e C++. La mia impressione attuale è che Fortran95 sarebbe più semplice da imparare, anche se il pacchetto Rcpp sembra molto interessante. Attualmente conosco R, Python e Matlab.

+0

Il tuo codice R è già stato vettorizzato? Esistono molti modi per ottimizzare il codice R senza codice C++/Fortan esterno. Buona domanda comunque, +1. – Marek

+0

Sì, ho provato a vettorizzare tutto ciò che posso. Ho bisogno di eseguire alcune iterazioni (AFAIK) che non possono essere vettorializzate e ho bisogno di usare un ciclo. –

+1

Non hai considerato C? – Shane

risposta

19

Se sarete scrivendo tutto il codice da soli, allora può dipendere da quale lingua ti piace di più, o può impara meglio/più velocemente Anche se Rcpp può darti un vantaggio nell'ottenere oggetti R in C++ e tornare più facilmente. Inoltre, le aggiunte più recenti in 0.8.3 forniscono espressioni vettoriali R-simili in codice compilato.

D'altra parte se si pianifica di utilizzare/riutilizzare/adattare le librerie esistenti, quindi darei un'occhiata a ad es.mloss.org e vedere in quale lingua sono disponibili le librerie di apprendimento automatico più utili e anche questa guida guida la tua decisione.

Per me, C++ fornisce astrazioni piuttosto utili più accesso a un'enorme base di codice di buona qualità generale. Ma altri si accontentano di Fortran. Dipende davvero da te, e in qualche misura dalle persone che ti circondano che possono dare supporto.

+0

Le nuove funzionalità Rcpp sembrano davvero molto allettanti. Grazie mille per il duro lavoro sul pacchetto! È possibile utilizzare le nuove dichiarazioni vettoriali con RcppArmadillo? –

+2

Sì - Armadillo ha il suo magico modello di espressione e Rcpp ora apporta le sue varianti a fianco. Intendiamoci, 'Rcpp sugar' funziona sui nostri vettori, non su Armadillos. Questo potrebbe essere colmato.Oh, e sentiti libero di accettare questa risposta se è questo che finisci a fare :) –

+0

Ho dato un'occhiata e riconsiderare qual è la risposta finale accettata :) Il problema è che so molto poco C++ quindi iniziare con Fortran sembra più facile, ma vedo più possibilità con C++. Non ho molto tempo per imparare adesso, ma mi piacerebbe davvero accelerare alcuni calcoli. –

3

Se sei nel mondo accademico, molte persone usano ancora Fortran, quindi questo potrebbe essere un vantaggio. Fortran è davvero bravo a masticare i numeri.

+0

Lavoro all'università e il mio campo è l'ingegneria agraria, so che gli allevatori di animali del mio dipartimento usano Fortran. –

+0

Quindi suggerirei di andare con fortran allora. –

+0

In realtà non condivido alcun codice con loro quindi non c'è vera sinergia ... Credo di poter avere qualche consiglio. Dovrò sicuramente dire loro che interfacciare le subroutine Fortran con R è relativamente facile. –

39

Scrivo un bel po 'di Fortran, un sacco di Matlab, e recentemente ho iniziato seriamente a imparare il C++. Penso che sarai produttivo nella tua nuova lingua prima se vai con Fortran piuttosto che con C++. Suggerisco di tenere presente questo punto:

  • Immagino che la maggior parte del numero di crunch che si vuole fare sia elaborare grandi matrici di numeri. Fortran è molto bravo in questo e ha costrutti fondamentali del linguaggio e funzioni intrinseche per le operazioni dell'intero array (non sempre è meglio performante di quanto lo faccia lo stress). C++ manca di queste funzionalità, devi programmarle tu stesso o usare una libreria come Boost (altamente raccomandato da persone molto più competenti di me).
  • Molte delle funzionalità che rendono C++ un linguaggio attraente per una vasta gamma di tipi di applicazioni (funzionalità quali modelli, tutte le cose OO, puntatori, riferimenti e altro) non sono molto utili all'interno del dominio. Sospetto che se hai bisogno di fare una programmazione 'intelligente' lo farai in R, lasciando Fortran per il semplice sollevamento pesante. Fortran ha anche molte di queste funzionalità, ma non sono così diffuse nella comunità di Fortran.
  • La mentalità di Fortran non è lontana dalla mentalità di Matlab, quindi il salto da quest'ultima alla prima non è enorme. In questo momento, inoltre, il mio punto di vista è che imparare abbastanza Fortran per essere produttivo nel tuo dominio sarà più rapido che imparare abbastanza C++.
  • Per quanto riguarda le prestazioni relative di Fortran e C++: non credere a nulla se non si hanno misurazioni di fronte a voi. Ma penso che devi lavorare duro e in modo intelligente per ottenere C++ in modo che corrisponda alle prestazioni di Fortran. Può certamente essere fatto, ma penso che sia più esigente delle capacità del programmatore. I compilatori Fortran hanno avuto oltre 50 anni di lavoro su di essi e l'ottimizzazione per la velocità di esecuzione è molto importante per noi programmatori Fortran.

non posso commentare affatto sulla facilità di integrazione di R e Fortran e C++

+1

Come nota sulle prestazioni: credo che i programmi fortran siano solitamente migliori di quelli C/C++ durante l'elaborazione degli array perché Fortran non ha puntatori. Un compilatore fortran può quindi eseguire ottimizzazioni in base al fatto che un array è accessibile solo attraverso il suo nome ("problema di aliasing" di Google per maggiori informazioni). –

+1

@Alexandre: beh, in realtà, Fortran ha dei puntatori. Ma penso, come te, che non sono necessari per l'elaborazione dell'array. –

+0

Grazie per l'intuizione. Sono d'accordo che la sintassi Fortran è molto facile da leggere quando si conosce Matlab. Ho scoperto che la libreria Armadillo e RcppArmadillo sembrano fornire le operazioni sull'array di cui ho bisogno per C++ e c'è anche una tabella di conversione della sintassi http://arma.sourceforge.net/docs.html#syntax per gli utenti Matlab. Penso che proverò ad implementare alcuni progetti abbastanza piccoli in entrambe le lingue e andare con quello che sembra più naturale. –

5

Fortran è il java di HPC. È possibile scrivere programmi molto efficienti in C++, ma è più facile scrivere lo stesso programma in Fortran, purché sia ​​adatto per il calcolo del numero. Nessuno scriverà seriamente un'applicazione GUI in Fortran, ma in HPC è imbattibile in velocità e concisione.

15

Fortran è stato il primo linguaggio di programmazione che ho imparato, da allora ho acquisito anche C e alcuni C++. I miei due centesimi sono che se hai bisogno di velocizzare rapidamente l'elaborazione di una matrice, sicuramente vai con Fortran. Le ragioni sono:

  • Fortran è veramente buono in modo efficiente elaborazione dati numerici, soprattutto quando viene memorizzato in matrici o array. Questo tipo di lavoro è il "punto debole" della lingua.

  • Poiché Fortran si concentra in modo ristretto sulle operazioni numeriche, ha una curva di apprendimento inferiore rispetto a C e C++. Ci sono meno caratteristiche linguistiche e peculiarità da apprendere e non devi occuparti dei puntatori. Questa è una grande vittoria se tutto ciò che vuoi è accelerare alcuni calcoli il più rapidamente possibile e andare avanti con il tuo lavoro.

  • Gli array multidimensionali e le operazioni con array sono cittadini di prima classe nella lingua Fortran. Con C o C++ è necessario preoccuparsi di utilizzare librerie esterne o scrivere funzioni/macro per fornire la stessa funzionalità.

D'altro canto, C e C++ sono decisamente più adatti per attività di programmazione scopo generale fuori del regno di calcolo numerico. Se vedi la possibilità di qualcosa come un sacco di manipolazione delle stringhe nel tuo futuro, allora probabilmente vorrai investire il tuo tempo in una lingua diversa da Fortran.

Aggiornamento

Un'altra considerazione importante è come i dati sono memorizzati ed elaborati sul lato R. Se usi fortran, dovrai passare i tuoi dati nelle routine compilate in modo molto semplice: scalari, vettori, ecc. Non ci sono liste o oggetti di fantasia.

Poiché R è implementato in C, è disponibile un'interfaccia più ricca che consente di passare direttamente oggetti R arbitrari a routine C e C++ e quindi restituire oggetti R arbitrari. È inoltre possibile eseguire callback che consentono di eseguire funzioni R all'interno del codice C compilato.

13

Ora ho fatto alcuni esperimenti nell'utilizzo di Fortran, C++ e R e penso di essere almeno mezzo pronto a rispondere alla mia stessa domanda ora. Ho finito per scrivere la funzione diff (e alcune altre piccole prove) sia in Fortran e C++ e chiamandolo da R.

Per cominciare credo che chiunque di fronte a questo problema dovrebbe leggere Writing R extensions, Rcpp introduction e Rcpp FAQ.

mi hanno ora scoperto alcuni punti importanti circa l'interfacciamento del codice da R che non sono ancora coperti nelle risposte:

  • Rcpp con il pacchetto in linea fa chiamare C++ da R estremamente facile e anche si prende cura di compilando l'estensione (vedi Domande frequenti su Rcpp), puoi specificare tutto ciò che non vuoi inserire nella funzione e ciò che non vuoi.
  • Utilizzando Rcpp e RcppArmadillo è possibile scrivere calcoli efficienti e chiamarli da R molto facilmente con una conoscenza di base del C++.
  • L'interfaccia R per Fortran ".Fortran" è molto più limitata, è necessario utilizzare una subroutine per farlo ed è necessario passare tutti i parametri in cui non si vuole uscire. Cioè (come ho capito) che è necessario preallocare e passare anche il vettore (i) risultato (o array) alla subroutine e la subroutine restituisce anche tutti i parametri. Non è così difficile, ma molto più incline agli errori, noioso e limitato.
  • Se wan't per scrivere un pacchetto portatile è necessario utilizzare F77 vedere here.

Così come una conclusione: per quello che ho bisogno di scrivere Fortran e C++ (con Armadillo) sembra ~ altrettanto facile (o difficile), ma l'interfacciamento del codice C++ da R è molto più semplice con Rcpp.

+0

Fantastico! Questo è più o meno ciò a cui miriamo a scriverlo, quindi è abbastanza gratificante vedere che funziona davvero per te in questo modo! ;-) –

+2

Ho appena finito di fare esattamente quello che volevo e sono riuscito a rendere la parte più lenta del codice 70 volte più veloce! Mi ci sono volute solo un paio d'ore, non penso che sia una cattiva notizia usare Rcpp, Armadillo e C++ per un vero progetto! Grazie ancora per il fantastico pacchetto! –

+5

Scrivere codice in Fortran 77 non è assolutamente un requisito per pacchetti R portatili. – Sharpie

Problemi correlati