View Full Version : Matlab è più lento dei codici di basso livello?
ciccio_g
08-03-2009, 12:50
Nella compilazione di codici per l'analisi numerica la velocità computaziole è tutto. So che matlab inteso come linguagio di programmazione è molto più lento di codici tipo c e fortran, ma mi preme sapere se le funzioni offerte da matlab (in particolare linsolve e inv) sono più lente delle corrispondenti funzioni di libreria in c e in fortan, considerandone le versioni più evolute che si trovano in rete. In definitiva in che rapporto stanno il tempo impiegato da matlab per invertire una matrice con la funzione inv e quello impiegato da fortan utilizzando la migliore libreria...
Cristiano87
08-03-2009, 13:20
prova e dicci :)
l'inversione dipende dall'algoritmo usato, dall'ordine della matrice e dalla risoluzione che hanno i numeri.
Dalla doc di matlab hai che:
X = linsolve(A,B) solves the linear system A*X = B using LU factorization with partial pivoting when A is square and QR factorization with column pivoting otherwise.
In generale se è un progetto importante per il quale conosci già la risoluzione che devono avere i numeri ed il tipo di scomposizione più efficiente per il tipo di matrici con cui lavorerai (che ne so, se è sparsa tot allora), forse ti conviene usare C e trovarti una buona libreria o addirittura scrivertela, ma è un lavoro oneroso e devi essere particolarmente ferrato in algebra :)
Matlab è la via più comoda, se non ti garba la fattorizzazione cerca qualche altra libreria =)
wingman87
08-03-2009, 13:36
Non conosco Matlab, però può darsi che come succede per altri linguaggi alcune funzioni e librerie siano scritte con un linguaggio diverso proprio per aumentare la velocità di calcolo. Se fosse così non avresti vantaggi usando C. Come ti ha detto Cristiano87 conviene provare
Attenzione perché per funzioni complesse è molto più importante usare un algoritmo allo stato dell'arte che usare un linguaggio che ti permette di ottenere un codice molto performante.
Mi spiego: se devi lavorare con una matrice 100x100 e l'algoritmo implementato in Matlab ha complessità O(n log n), mentre il tuo ha complessità O(n^2), è possibile che tu abbia anch eun peggioramento.
Quindi è sì improtante usare un linguaggio che abbia buone prestazioni, ma è ancora più importante usare un algoritmo e strutture dati allo stato dell'arte.
Attenzione perché per funzioni complesse è molto più importante usare un algoritmo allo stato dell'arte che usare un linguaggio che ti permette di ottenere un codice molto performante.
Mi spiego: se devi lavorare con una matrice 100x100 e l'algoritmo implementato in Matlab ha complessità O(n log n), mentre il tuo ha complessità O(n^2), è possibile che tu abbia anch eun peggioramento.
Quindi è sì improtante usare un linguaggio che abbia buone prestazioni, ma è ancora più importante usare un algoritmo e strutture dati allo stato dell'arte.
quoto
Vincenzo1968
08-03-2009, 19:08
Quoto anch'io Cionci.
Ma è chiaro che, a parità di complessità, il linguaggio C fa la differenza ;)
:bimbo:
ciccio_g
08-03-2009, 22:40
Attenzione perché per funzioni complesse è molto più importante usare un algoritmo allo stato dell'arte che usare un linguaggio che ti permette di ottenere un codice molto performante.
Mi spiego: se devi lavorare con una matrice 100x100 e l'algoritmo implementato in Matlab ha complessità O(n log n), mentre il tuo ha complessità O(n^2), è possibile che tu abbia anch eun peggioramento.
Quindi è sì improtante usare un linguaggio che abbia buone prestazioni, ma è ancora più importante usare un algoritmo e strutture dati allo stato dell'arte.
Tale considerazione è giustissima, poichè se un algoritmo ha una complessità più bassa, anche implementandolo in un codice pessimo, che impiega molto più tempo per fare la singola operazione, al tendere di n all'infinito impiegherà comunque un tempo infinitamente più basso. Per questo motivo nella mia domanda facevo riferimento alle milgiori librerie (dal punto di vista di efficienza dell'algoritmo) che si trovano in rete per il calcolo lineare in c o in fortran, dando in qualche modo per scontato che anche matlab essendo un software di calcolo implementi l'algoritmo ottimo. Per tagliare la testa al toro riformulo la domanda:
Ipotizziamo che la funzione linsolve utilizzi l'algoritmo più efficiente per risolvere i sistemi lineari e consideriamo una libreria in fortran che si basi sullo stesso algoritmo: chi dei due è più veloce?
PS: è ovvio che se uno sciagurato anzichè utilizzare linsolve implementasse in un m file l'algoritmo in esame otterrebbe una funzione molto più lenta (anche se con la stessa complessità) dei codici di basso livello...
Per l'algebra lineare Matlab (e Mathematica e R e molti altri ambienti di sviluppo ad alto livello) usano le librerie BLAS e LAPACK scritte in fortran 77 e poi tradotte in C, ergo, in questo caso Matlab è veloce come il C o il Fortran.
ciao
tiMo
sottovento
09-03-2009, 05:06
Mia esperienza personale: occorre studiare molto bene il problema per essere piu' veloci di Matlab,e spesso si riesce al massimo ad eguagliarlo.
Spesso Matlab e' cosi' veloce da non sembrar vero che abbia gia' fatto tutti i conti, mentre magari il tuo programma non e' nemmeno ad un decimo.
In azienda abbiamo diversi gruppi che si occupano di sviluppare modelli matematici per i nostri impianti. Ogni gruppo fa le scelte tecniche che vuole.
In particolare, conosco 3 gruppi che hanno fatto 3 scelte distinte:
- Fortran
- C++
- Matlab
Il gruppo che usa Matlab ha prodotto il modello matematico piu' accurato, efficente ed estremamente performante.
Il gruppo che usa Fortran ha prodotto un modello che non e' lo stato dell'arte, ma funziona discretamente in tutte le condizioni, anche non nominali. Spesso non produce la soluzione ottimale ma l'impianto puo' funzionare correttamente anche con la soluzione trovata.
Il gruppo che usa C++ sta cercando di capire perche' va in crash in condizioni non nominali, e sta cercando di trovare memory leak e capire perche' gira cosi' lentamente.
Purtroppo non posso portare riferimenti per mostrare quanto ho affermato.
Cmq e' tutto vero.
Morale della favola: programmate in C++!! Infatti in azienda e' il gruppo piu' pagato.....
Io più che dare la colpa al C++, darei la colpa ai programmatori :asd:
Insomma, prima di provare a costruire modelli matematici sarebbe il caso di imparare ad accoppiare i new coi delete no?
In più l'algoritmo non dipende dal linguaggio, quindi dovevano _almeno_ farlo funzionare come in fortran.
cdimauro
09-03-2009, 08:57
Io più che dare la colpa al C++, darei la colpa ai programmatori :asd:
Insomma, prima di provare a costruire modelli matematici sarebbe il caso di imparare ad accoppiare i new coi delete no?
Quindi anche programmatori esperti e/o famosi e/o ben pagati che rilasciano applicazioni bacate in realtà sconoscono le basi della programmazione in C++?
"I memory leak non esistono". :O
Nella compilazione di codici per l'analisi numerica la velocità computaziole è tutto. So che matlab inteso come linguagio di programmazione è molto più lento di codici tipo c e fortran, ma mi preme sapere se le funzioni offerte da matlab (in particolare linsolve e inv) sono più lente delle corrispondenti funzioni di libreria in c e in fortan, considerandone le versioni più evolute che si trovano in rete. In definitiva in che rapporto stanno il tempo impiegato da matlab per invertire una matrice con la funzione inv e quello impiegato da fortan utilizzando la migliore libreria...
Secondo me, se ti fai questa domanda, puoi tranquillamente buttarti su matlab. Per quel poco che l'ho usato all'università, è uno strumento perfetto per fare calcolo numerico.
Il linguaggio è un pò da sindrome "Oh mio diooo, i miei occhi! I miei bellissimi occhi!!", però nel complesso fa il suo sporco lavoro dannatamente bene. E poi come ti è stato detto, per le operazioni "a basso livello", tipo moltiplicare matrici, usa già librerie ultra-ottimizzate.
sottovento
09-03-2009, 09:10
Io più che dare la colpa al C++, darei la colpa ai programmatori :asd:
Insomma, prima di provare a costruire modelli matematici sarebbe il caso di imparare ad accoppiare i new coi delete no?
In più l'algoritmo non dipende dal linguaggio, quindi dovevano _almeno_ farlo funzionare come in fortran.
Beh, in azienda siamo in 9000. Si possono trovare skill molto diversi fra di loro.
C'e' da dire che la progettazione di un software (soprattutto quando di grandi dimensioni) terra' conto del linguaggio con cui si andra' poi a realizzare il tutto.
Non e' quindi insolito che lo stesso algoritmo sia stato implementato in maniera diversa nei tre diversi linguaggi di programmazione.
sottovento
09-03-2009, 09:14
Quindi anche programmatori esperti e/o famosi e/o ben pagati che rilasciano applicazioni bacate in realtà sconoscono le basi della programmazione in C++?
"I memory leak non esistono". :O
Pensavo fosse "Il caso non esiste". Non era la tartaruga di Kung Fu Panda?
In effetti la domanda che hai fatto e' ben posta.
Cmq esistono due tipi di lavori: quelli belli (chiamati "A" ) e quelli brutti (chiamati "B").
Per sapere se stai facendo un lavoro di tipo "A" o "B" c'e' un criterio di selezione basato su una domanda molto semplice.
La domanda e': "Funziona?"
- Se sei tu a porre questa domanda, allora il tuo lavoro e' di classe "A";
- Se devi rispondere a questa domanda, allora il tuo lavoro e' di classe "B";
Se hai scelto come linguaggio di programmazione (o te l'hanno imposto) il C++, la risposta sara': "Si, ma....."
federico100mt
09-03-2009, 09:44
io personalmente venendo dal supercalcolo ho constato che matlab ha dei grossi problemi nelle fasi di I/O, per grandi quantità di dati prticamente esplode, un buon porting da matlab a C è risultato essere quai 1/3 più veloce, analizzando solo "il blocco dei calcoli"... :)
federico100mt
09-03-2009, 09:45
io personalmente venendo dal supercalcolo ho constatato che matlab ha dei grossi problemi nelle fasi di I/O, per grandi quantità di dati prticamente esplode, un buon porting da matlab a C è risultato essere quasi 1/3 più veloce, analizzando solo "il blocco dei calcoli"... :)
ciccio_g
09-03-2009, 13:24
Ho ricevuto molte risposte, ma anche alcune che non c'entrano niente con la domanda per come è stata formulata.
Io inizialmente una mia idea la avevo ed era quello che ha detto tiMo, ovvero che per l'algebra lineare matlab è insuperabile dai codici di basso livello, non fosse altro perchè si appoggia ad essi. A proposito di ciò non ho ricevuto altre indicazioni dirette, perciò se qualcuno condivide tale tesi, prego di quotare.
Per quanto riguarda quello che ha detto Antonio23 mi sembra molto strano che matlab impieghi molto tempo per invertire una matrice: forse è lento perchè il programma nel complesso deve fare altre oprazioni che in c sono molto più veloci.
Anche se la mia domanda ha carattere generale ti faccio un esempio relativo alla mia esperienza:
in questo periodo sto scrivendo codici agli elementi finiti ed è noto che il grosso del tempo è preso dalla risoluzione delle equazioni algebriche: ebbene fino a matrici di tipo 2000*2000 nel mio codice c'è un pezzo per l'assemblaggio della mesh che ho scritto in matlab e ha complessità quadratica ed impiega fino a un minuto, mentre per la risoluzione del matlab ci mette pochi secondi: di conseguenza se volessi ottimizzare basterebbe scrivere un codice in c per eseguire la prima parte e lasciare la risoluzione a matlab perchè sono dell'idea che offra gia il tempo minimo...
PS: lasciamo stare che ho provato a farlo e come dicevate voi mi da problemi di memoria e si chiude proprio matlab...
Cerchiamo di essere più precisi: se sfrutti un algoritmo già implementato in matlab è chiaro che è molto veloce, visto che praticamente svolge esclusivamente calcoli con linguaggi di basso livello.
Se invece vai ad implementare un TUO algoritmo in Matlab, che sfrutta non solo primitive/API Matlab, ma anche funzioni del linguaggio stesso come manipolazione di variabili e vettori, cicli etc etc è ovvio che sia più lenta di un linguaggio di basso livello...ma per vari motivi: prima di tutto il linguaggio di Matlab è interpretato, di fatto il syntax checking viene fatto istruzione per istruzione. Poi anche il semplice passaggio dei dati dall'interprete alle primitive è molto probabile che crei copie che in un linguaggio di più basso livello non sarebbero necessarie, chiaramente all'aumentare della dimensione degli input e degli output questa cosa incide in maniera molto pesante.
Insomma è palese che un algoritmo realizzato con il linguaggio di Matlab sia più lento di uno realizzato in un linguaggio di basso livello, a parità di algoritmi e disponendo dell'adeguata capacità tecnica per implementarli nel linguaggio di basso livello.
ciccio_g
09-03-2009, 14:07
Insomma è palese che un algoritmo realizzato con il linguaggio di Matlab sia più lento di uno realizzato in un linguaggio di basso livello, a parità di algoritmi e disponendo dell'adeguata capacità tecnica per implementarli nel linguaggio di basso livello.
È quello che ho già ribadito 2 volte...infatti avendo accurato che per l'algebra lineare matlab con le sue funzioni intrinseche (linsolve,inv) si appoggia ai codici di basso livello, sarebbe bello sapere da qualcuno che ha un esperienza diretta se in ogni caso possa essere più lento per qualche motivo o se non ha di questi problemi e per altro è da considerarsi il top della rapidità, poichè dal punto di vista dell'algoritmo impiegherà sicuramente il migliore attualmente disponibile...
Ho ricevuto molte risposte, ma anche alcune che non c'entrano niente con la domanda per come è stata formulata.
Io inizialmente una mia idea la avevo ed era quello che ha detto tiMo, ovvero che per l'algebra lineare matlab è insuperabile dai codici di basso livello, non fosse altro perchè si appoggia ad essi. A proposito di ciò non ho ricevuto altre indicazioni dirette, perciò se qualcuno condivide tale tesi, prego di quotare.
[...]
Non c'e' bisogno che qualcun altro condivida, puoi andare direttamente nel sito Mathworks se non ti fidi
http://www.mathworks.com/support/solutions/data/1-18QUC.html
questo invece e' il sito originale delle BLAS
http://www.netlib.org/blas/
Si possono ottenere risultati migliori rispetto al default se si usa una versione delle BLAS espressamente compilata/ottimizzata per un architettura specifica o per sfruttare il multicore. Intel ha le MKL mentre AMD ha le ACML, nel link che ti ho postato ti dicono come fare per usarle.
ciao
tiMo
È quello che ho già ribadito 2 volte...infatti avendo accurato che per l'algebra lineare Matlab con le sue funzioni intrinseche (linsolve,inv) si appoggia ai codici di basso livello, sarebbe bello sapere da qualcuno che ha un esperienza diretta se in ogni caso possa essere più lento per qualche motivo o se non ha di questi problemi e per altro è da considerarsi il top della rapidità, poiché dal punto di vista dell'algoritmo impiegherà sicuramente il migliore attualmente disponibile...
Dipende tutto dal tuo problema, non esiste una ricetta unica.
Un buon modo di procedere e' il seguente:
1. implementi l'algoritmo in un ambiente ad alto livello (diciamo Matlab), dal momento che e' molto facile da usare.
Se la velocità di esecuzione e i risultati sono soddisfacenti puoi anche fermarti, in caso contrario:
2. Fai il profiling del codice e individua i colli di bottiglia.
3. implementa in C/Fortran o qualche altro linguaggio a basso livello i pezzi di codice per i quali hai colli di bottiglia.
4. Inserisci nel tuo codice Matlab i pezzi di codice compilato (file mex)
ciao
tiMo
Quindi anche programmatori esperti e/o famosi e/o ben pagati che rilasciano applicazioni bacate in realtà sconoscono le basi della programmazione in C++?
"I memory leak non esistono". :O
I programmatori che citi te, quando scoprono il memory leak lo correggono, dato che gli era sfuggito e può capitare.
Quando invece la totale lentezza e la memoria che esce da tutti i buchi sono l'unico motivo per cui non sei in tempo, allora si. Sei scarso :asd:
Ci sono tonnellate di modi per evitare i memleak, dall'override di new e delete al pooling fino alla costruzione di un garbage collector... è vero che se non si usa il C++ non *serve* usarli (per quanto usarli comunque è conveniente), ma è anche vero che ci si aspetterebbe da un "esperto" che lo sappia fare.
I programmatori che citi te, quando scoprono il memory leak lo correggono, dato che gli era sfuggito e può capitare.
Quando invece la totale lentezza e la memoria che esce da tutti i buchi sono l'unico motivo per cui non sei in tempo, allora si. Sei scarso :asd:
Ci sono tonnellate di modi per evitare i memleak, dall'override di new e delete al pooling fino alla costruzione di un garbage collector... è vero che se non si usa il C++ non *serve* usarli (per quanto usarli comunque è conveniente), ma è anche vero che ci si aspetterebbe da un "esperto" che lo sappia fare.
Con la differenza che a parita' di tempo in un caso alla fine hai un programma che fa quello che doveva fare, nell'altro... un garbage collector ?
ciccio_g
10-03-2009, 00:22
Non c'e' bisogno che qualcun altro condivida, puoi andare direttamente nel sito Mathworks se non ti fidi
Perfetto, allora la prendo per definitiva. Ti ringrazio per il contributo.
Per quanto riguarda il modo di procedere, come già avevo accennato in un intervento precedente, faccio proprio come dici tu, cercando di usare funzioni intrinseche in matlab e appoggiandomi a delle mex function (sempre se riesco a scriverle!) nel caso in cui non ci sono funzioni intrinseche ed il codice in matlab è troppo lento.
sottovento
10-03-2009, 03:16
I programmatori che citi te, quando scoprono il memory leak lo correggono, dato che gli era sfuggito e può capitare.
Quando invece la totale lentezza e la memoria che esce da tutti i buchi sono l'unico motivo per cui non sei in tempo, allora si. Sei scarso :asd:
Immagino che sia una tua analisi, da cui derivi un tuo punto di vista.
Nel caso da me citato, come dicevo, migliaia di persone sviluppano questo codice. Qual e' quello scarso, esattamente?
cdimauro
10-03-2009, 06:13
I programmatori che citi te, quando scoprono il memory leak lo correggono, dato che gli era sfuggito e può capitare.
Quando invece la totale lentezza e la memoria che esce da tutti i buchi sono l'unico motivo per cui non sei in tempo, allora si. Sei scarso :asd:
Ci sono tonnellate di modi per evitare i memleak, dall'override di new e delete al pooling fino alla costruzione di un garbage collector... è vero che se non si usa il C++ non *serve* usarli (per quanto usarli comunque è conveniente), ma è anche vero che ci si aspetterebbe da un "esperto" che lo sappia fare.
Quando svilupperai qualcosa di più complicato del banale giochino in C++, ne riparleremo.
Nel frattempo ti faccio notare che ci sono migliaia e migliaia di professionisti che, "bontà loro", hanno a che fare con bug e memory leak. E non per loro demerito o deficienza.
D'altra parte la teoria della computabilità, che immagino conoscerai come le tue tasche, fornisce una prospettiva tutt'altro che entusiasmante quando mette in relazione il codice e i bug.
Allora il problema sarà l'organizzazione alla base, non lo so.
Fatto sta che come ci sono "espertoni" che trovano il C++ una trappola per la gestione della memoria, ci sta una quantità di persone che invece lo usano senza problemi... che so tipo tutti quanti i linux, Ogre3D, PhysX, Havok, gran parte dei giochi moderni, giusto per citare "robetta" in C/C++ che ho provato e che non aveva l'ombra di un memory leak.
Quindi per voi se si usa C++ si ha per forza cattive prestazioni e memory leak?
E per voi un gioco in C++ è banale?
Mah :doh:
Non andiamo OT, grazie ;)
StateCity
10-03-2009, 11:35
Implementare funzioni in Matlab e cercare efficenza, e' pura utopia.. :asd:
Non e' miniamamente equiparabile ad un programma scritto in C
e ottimizzato in assembler o ancor meglio direttamente in assembler
per sfruttare appieno anche le istruzioni in virgola mobile. :rolleyes:
Matlab sara' sicuramente molto piu' lento di codici scritti a basso livello. :)
in ogni caso chi nn ci crede si faccia un benchmark..
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.