Python vs. Matlab il banchmark

 Dopo aver constato che python offre un ottima alternativa a matlab almeno dal punto di vista delle funzionalità, ora bisogna vedere chi è il più veloce.

Quindi ho messo in piedi un piccolo test per vedere chi fa meglio. Sul campo ci sono python con le librerie numpy compilate con le MKL e matlab 2012a il tutto su ArchLinux a 64bit e CPU Core i7 a 3.4 Ghz.

Il test si divide in 10 parti ed è costituito per la maggior parte  di operazioni di algebra lineare più alcune operazioni importanti.

La lista dei test

  1. EIG: Eigenvalues
  2. SVD: Single value decomposition.
  3. INV: Matrice inversa
  4. DET: determinante 
  5. DOT: Prodotto scalare
  6. FFT: Trasformata veloce di fourier su un vettore
  7. CONV: Convoluzione fra due vettori
  8. MatMult: Moltiplicazione di matrici 
  9. Sin: Eseguire l’operazione sin su una matrice.
  10. rand: generare una matrice di numeri random

Qui i sorgenti dei test; disponibili su gitorius
https://gitorious.org/python-vs-matlab/python-vs-matlab

I risultati

ogni test è stato eseguito 5 volte di fila e il tempo riportato è quello medio. Il test è stato fatto con python-numpy basato su MKL che sul numpy inserito nei repository ufficiali di Archlinux ovvero basato su LAPACK, e quello basato su ATLAS disponibile su AUR  per matlab ho pure provato ad attivare la funzione GPU, per vedere la differenza.
Le dimensioni rappresentano la dimensione delle matrici, e nel caso della FFT e della convoluzione dei vettori usati (nb. per la conv. sono necessari due vettori). Il tempo è misurato in secondi.

Dimensione python MKL Matlab python Lapack python ATLAS Matlab GPU
EIG 2000 x 2000 7.52 3.44 40.8 31.34 2.61
SVD 2000 x 2000 6.85 5.53 55.3 13.44 6.2
INV 4000 x 4000 2.25 1.74 54.3 3.6 1.96
DET 5000 x 5000 1.07 1.02 26.73 2.00 0.97
DOT 4000 x 4000 1.37 1.33 155.53 157.6 1.26
CONV 2*10^6&10000 3.15 1.25 16.32 16.20 0.23
FFT¹ 1 *10^7 0.26 0.13 0.26 0.26 0.034
MatMult 5000 x 5000 2.56 2.58 302.83 299.17 2.42
Sin 4000 x 4000 1.98 0.042 1.99 2.71 0.00028
Rand 10000×10000 1.09 0.92 1.09 1.09

Nota: np MKL, python LAPACK e python ATLAS sono tutti test fatti con numpy
¹La FFT è stata eseguita con le scipy.fftpack.fft che si è rilevata la funzione  più  performante rispetto alla fft presente in numpy.

Ed infine i grafici dei tempi e delle velocità con numpyMKL;  matlab e matlabGPU, dove si vede chiaramente che matlab da risultati migliori.

Il primo grafico riporta i tempi di matlab e numpy-MKL, escludendo il test sin. Con matlab che in genere è il più veloce

Il secondo Grafico è quello delle velocità poste su scala logaritmica dove ci sono numpy-MKL, matlab e matlab-GPU con tutti i test, in questo caso si vede chiaramente il problema del test sin e l’accelerazione che possono garantire le GPU.

Conclusione

Quello che si può dire è che la copia numpy e MKL va bene, ma non è ancora al livello di matlab, e purtroppo devo notare il mancato collegamento  della FFT a MKL e il disastroso risultato della operazione più banale, ovvero eseguire il seno su tutti gli elementi di una matrice. Comunque in molti test la velocità fra numpy e matlab è ormai equivalente.

Per quanto riguarda lapack, il risultato è veramente disastroso, mentre per ATLAS è contrastante, ma di sicuro molto inferiore a quello di MKL.

Infine matlab con GPU da risultati ottimi con la FFT e la convoluzione e col resto è circa uguale, ma non sempre migliore,  questo mostra che le GPU nel momento in cui lavorano in condizioni ottimali sono imbattibili ma col limite della memoria, che mi ha impedito di fare alcuni test con matrici troppo grandi, ed in alcuni casi diventa poco efficiente.

In conclusione python è sempre meglio, ma ha bisogno di essere ancora sviluppato e offre a tutti gli effetti un ottima alternativa a matlab.


Ps:
Nel fare i test ho preso in parte ispirazione da questo articolo

Per gli utenti ArchLinux, ho messo su AUR i PKGBUILD delle numpy e scipy basate su MKL.
https://aur.archlinux.org/packages.php?ID=62281
https://aur.archlinux.org/packages.php?ID=62572

Pacman, AUR helper e Front End

 Ma quanti ce ne sono:

https://wiki.archlinux.org/index.php/AUR_Helpers
https://wiki.archlinux.org/index.php/Pacman_GUI_Frontends

Sembra quasi che l’hobby preferito degli utenti ArchLinux sia scrivere un AUR helper o un pacman front-end.

Io devo dire che ne ho provati alcuni ma alla fine sono sempre tornato a pacman da linea di comando. Per la ricerca dei pacchetti c’è il sito di Archlinux e con google si trova tutto e meglio che con qualsiasi front end.
A cosa serve tutto il resto?
O forse non sarebbe male un front-end con interfaccia web che cerca i pacchetti su www.archlinux.org e installa il pacchetto della pagina web caricata.

Gli AUR helper sono utili per gestire i pacchetti AUR, ma nei casi di sotto-pachetti in genere gli helper non funzionano.

Quindi adesso uso pacman e sto provando packer come AUR helperma devo dire che l’helper veramente completo non c’è ancora.

IPython una shell per per python, che forse può competere con matlab.

Che python abbia raggiunto un ottima maturità di sviluppo è sicuro.

Ma uno degli sviluppi più interessanti di questo linguaggio è quello legato alle librerie matematiche ovvero  numpy e scipy, che per completezza e prestazioni possono ormai competere col più blasonato matlab.

Quello che ci vorebbe per completare l’opera è una shell che permetta all’utente di usare python direttamente e con tutte le funzioni matematiche in linea. Bene questa shell esiste ed è ipython se usata normalmente è una shell python normale, ma se si abilita la funzione pylab diventa un ottima shell matematica; che va lanciata col comando:

> ipython qtconsole --pylab


Una volta aperta la finestra la si potrà usare per fare grafici o calcoli quasi come se si fosse con matlab. Il vero limite di ipython è l’assenza di collegamenti verso librerie per i grafici 3D, infatti matplotlib supporta in modo ancora un po limitato il 3D.

Un altro vantaggio di matlab è quello di avere un gestore della shell più completo e flessibile, ma a veder bene se ne può anche fare a meno. Inoltre ipython ha delle caratteristiche non presenti in matlab.

Ultimo punto la velocità: chi è meglio, di certo numpy con MKL se la cava molto bene, e può anche andare meglio di matlab, ma non su tutto.

Compilatore Intel C / C++

Dopo aver faticato per costruire il PKGBUILD di questo compilatore, vorrei fare una piccola presentazione per i curiosi o interessati.

Per come la penso tutti gli sviluppatori di C o C++ dovrebbero almeno provare questo compilatore che al momento è forse il migliore disponibile per CPU Intel.

Come installare

Per prima cosa bisogna andare sulla pagina AUR e scaricare il PKGBUILD, attenzione che questo PKGBUILD non funziona con yaourt a causa del mancato supporto ai sotto-pacchetti da parte di yaourt.

Come seconda cosa bisogna ottenere una licenza non commerciale per Intel parallel studio XE da Intel a questa pagina http://software.intel.com/en-us/non-commercial-software-development, la licenza scade dopo un anno e va rinnovata ogni volta. Una volta ottenuta il file di licenza va copiato nella directory del PKGBUILD assieme a tutti gli altri files.

La costruzione dei pacchetti è un po lunga ma semplicissima, si entra nella directory del PKGBUILD e  e si da il comando makepkg. È da notare che il pacchetto scaricato da Intel supera 1Gb di dimensione.

Una volta finito di costruire i pacchetti, per avere un ambiente di lavoro funzionante minimo, bisogna installare:
intel-compiler-base e intel-openmp; e se si vuole pure il compilatore fortran: intel-fortran-compiler.
Tutti gli altri pacchetti sono delle librerie extra.

Come funziona

Appena installato si deve effettuare un nuovo log-in come utente per attivare le variabili d’ambiente.
Una volta fatto date da terminale il comando icc o icpc se risponde significa che funziona tutto. Ed ora non dovete far altro che provarlo con i vostri programmi.

Ad esempio se avete un programma che si chiama mio_prog.c basta dare il comando:
icc mio_prog.c -o mio_prog
Usando una sintassi molto simile a quella di gcc. Per maggiori informazioni si può usare icc -help o man icc.
Mentre per chi viole usare il C++ il comando è icpc e per i rari sviluppatori fortran si deve usare ifort.

Il compilatore Intel in genere è molto tollerante e offre una buona compatibilità con gcc che può essere migliorata usando l’opzione di compilazione -gcc.

Il vantaggio di questo compilatore è dato da una forte integrazione con l’hardware e da dei modelli di ottimizzazione molto aggressivi, quindi spesso può produrre degli eseguibili più preformanti rispetto a quelli generati con gcc, anche se bisogna ammettere che le ultime versioni di gcc sono molto valide.

Per altre informazioni visitate la WIKI di archlinux: https://wiki.archlinux.org/index.php/Intel_C%2B%2B_(Italiano)

Risultati

Se associato a librerie come intel-mkl questo compilatore può dare risultati molto buoni, ad esempio ricompilato numpy con icc e mkl in alcuni casi le prestazioni di calcolo possono crescere anche di diverse volte, mentre per i casi medi le prestazioni sono in genere simili a quelle di gcc, con un leggero vantaggio per Intel.

Se siete interessati a numpy con mkl e icc: numpy con MKL e per scipy: scipy con MKL .

Per avere un esempio di quanto possano crescere le prestazioni con mkl consiglio di provare l’esempio riportato da Intel:
http://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl
A
nche se si tratta di un esempio favorevole ai prodotti Intel, le prestazioni crescono di circa 50 volte se confrontate con quelle di numpy fornito nel repository di Arch.

Conclusioni

Ritengo che tutti gli sviluppatori o appassionati di C e C++ dovrebbero provare questo compilatore, che nella pratica resta uno dei migliori compilatori attualmente in circolazione.