|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Mar 2009
Messaggi: 14
|
Matlab è più lento dei codici di basso livello?
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...
|
![]() |
![]() |
![]() |
#2 |
Junior Member
Iscritto dal: Mar 2009
Città: Milano
Messaggi: 6
|
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 =) |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
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
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quoto anch'io Cionci.
Ma è chiaro che, a parità di complessità, il linguaggio C fa la differenza ![]() ![]() |
![]() |
![]() |
![]() |
#7 | |
Junior Member
Iscritto dal: Mar 2009
Messaggi: 14
|
Quote:
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... |
|
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Jan 2005
Messaggi: 157
|
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
__________________
The plural of anecdote is not data. ~ Roger Brinner |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
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.....
__________________
In God we trust; all others bring data |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Io più che dare la colpa al C++, darei la colpa ai programmatori
![]() 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. |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
"I memory leak non esistono". ![]()
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
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.
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers |
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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.
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Quote:
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....."
__________________
In God we trust; all others bring data |
|
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: Apr 2008
Messaggi: 86
|
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"...
![]() |
![]() |
![]() |
![]() |
#16 |
Member
Iscritto dal: Apr 2008
Messaggi: 86
|
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"...
![]() |
![]() |
![]() |
![]() |
#17 |
Junior Member
Iscritto dal: Mar 2009
Messaggi: 14
|
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... |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. |
![]() |
![]() |
![]() |
#19 |
Junior Member
Iscritto dal: Mar 2009
Messaggi: 14
|
È 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...
|
![]() |
![]() |
![]() |
#20 | |
Member
Iscritto dal: Jan 2005
Messaggi: 157
|
Quote:
http://www.mathworks.com/support/sol...a/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
__________________
The plural of anecdote is not data. ~ Roger Brinner |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:52.