2012-09-24 23 views
32

Ho utilizzato Octave e MATLAB per alcuni progetti e ho trovato alcune domande. Questa domanda Why/when should I prefer MATLAB over Octave? ha risposto diversi, ma ce n'è ancora uno ...Perché Octave è più lento di MATLAB?

Ho letto un numero di post/altre fonti che confrontano le prestazioni di Octave e MATLAB e ho eseguito alcuni dei miei test su standard script che confermano il consenso generale sul fatto che Octave è generalmente molto più lento di MATLAB per le operazioni standard (ovviamente iterato, in modo che il confronto sia significativo).

Il consenso sembra anche suggerire che la maggior parte delle prestazioni di MATLAB sono attribuibili al compilatore JIT, che compila grandi loop in fase di esecuzione. Questo ha senso, e le maggiori differenze di prestazioni sembrano verificarsi in questi casi (ad esempio Mathworks Matlab vs Gnu Octave)

La mia domanda è la seguente: perché dovrebbe essere il caso che il codice vettoriale sia eseguito più lentamente in Octave? Sembra che in questo caso la memoria dovrebbe essere messa da parte prima del ciclo e qualche ciclo C/C++ nativo dovrebbe eseguire l'operazione, il che equivale a prestazioni tra Octave e MATLAB per il codice vettoriale. Inoltre, questo ha implicazioni più ampie, ad esempio che Octave potrebbe funzionare in modo peggiore per operazioni complesse, anche se il codice è scritto in modo tale che un compilatore JIT non è necessario/inutilizzato?

+0

È stato scritto molto sul miglioramento delle prestazioni del JIT di Matlab, il JIT di Matlab non è in grado di effettuare chiamate in linea e sono incerto su come ottimizzare i loop FOR in base agli odds differenziali di prestazioni tra un ciclo FOR in Matlab e JAVA (che ha un JIT funzionante). Tutte le implementazioni di linguaggi interpretati hanno un JIT, ma Matlab's è piuttosto debole. – Mikhail

risposta

32

Ci sono quattro modi come codice Matlab viene accelerato:

  • JIT: la compilazione a runtime aiuta con i cicli, ma sembra accelerare (o almeno interagire con) altre parti del codice pure, secondo le mie osservazioni aneddotiche.

  • Implementazione di funzioni in C/C++: c'è una serie di funzioni Matlab/Octave implementate in Matlab/Octave. Ad ogni uscita, ce ne sono un sacco in più che vengono trasformati in built-in.

  • Multithreading: c'è a list of functions con implementazioni multithread che accelerano le chiamate di funzione.

  • Implementazioni generalmente più efficienti. Ad esempio il filtro mediano ha ottenuto un enorme aumento di velocità per gli ingressi interi di qualche uscita fa.

Tutti questi approcci hanno bisogno di sviluppatori dedicati per rendere il codice più veloce. Per quanto ne so, una delle maggiori preoccupazioni degli sviluppatori di Octave è di assicurarsi che la funzionalità (Matlab) sia presente, mentre l'aumento delle prestazioni sembra essere stato un punto focale dello sviluppo di Matlab negli ultimi anni.

+0

Se si guarda alle prestazioni di un ciclo non-vettorizzato rispetto a un'operazione vettoriale vettorizzata, è chiaro che per operazioni semplici come un in-product Octave può spendere il 75% del suo tempo a interpretare il corpo del ciclo invece di fare matematica. Sospetto che MATLAB JIT'ter sia anche più in grado di eliminare le sottoespressione comuni - i compilatori in genere ne sono più consapevoli. – MSalters

10

Matlab utilizza internamente la libreria del kernel Math Intel (Intel MKL) per le operazioni vettoriali e matriciali. Ciò conferisce a Matlab un vantaggio significativo su Octave.

Provate i comandi 'versione -lapack' e 'versione -blas' nel vostro Matlab per verificare la versione di MKL che sta usando il vostro Matlab.

Un collegamento rapido che illustra l'utilizzo di MKL da parte di Matlab è http://stanford.edu/~echu508/matlab.html.

Intel MKL è proprietario. software.intel.com/en-us/intel-mkl. Tuttavia, per uso non commerciale, la versione di Linux è gratuita. Se Octave può in qualche modo utilizzare il MKL installato sulle nostre macchine, dovrebbe velocizzare in modo significativo Octave.

+2

È davvero interessante. Potete fornire un link o una citazione con maggiori informazioni a riguardo? – darthbith

+0

Questo è interessante. È proprietario o qualcosa del genere? Altrimenti perché anche Octave non lo userebbe? –

+2

@Sooraj È possibile fornire anche un collegamento che indichi come/dove Matlab utilizza Intel MKL? Se si desidera utilizzare Intel MKL con Octave, molto probabilmente si dovrà compilare Octave da soli, consultare: http://software.intel.com/en-us/articles/using-intel-mkl-in-gnu-octave – darthbith