[MatLab] Stesso codice, diverso sistema operativo, diverso risultato. Perché?
Buongiorno a tutti,
ho un codice scritto in Matlab a 32bit che faccio girare su sistema operativo windows a 64 bit solitamente. Recentemente, invece mi sono accorto che lo stesso codice esegue dei calcoli che hanno dei risultati lievemente differenti se utilizzato con windows a 32bit.
Qualcuno ha avuto lo stesso problema?
Grazie
metrixo
ho un codice scritto in Matlab a 32bit che faccio girare su sistema operativo windows a 64 bit solitamente. Recentemente, invece mi sono accorto che lo stesso codice esegue dei calcoli che hanno dei risultati lievemente differenti se utilizzato con windows a 32bit.
Qualcuno ha avuto lo stesso problema?
Grazie
metrixo
Risposte
"metrixo":
ho un codice scritto in Matlab a 32bit
Che significa che il codice è scritto a 32 bit?
Significa che ho usato una versione di Matlab a 32bit per scrivere il programma e infatti lo uso con Matlab a 32bit con un sistema operativo a 64bit. Poi, usandolo quasi per sbaglio su una macchina a 32bit mi sono accorto di alcune differenze.
tipo...?
tipo che di un calcolo in cui mi aspetto circa una decina di risultati, alcuni di questi erano uguali e altri diversi (anche di un fattore 2 per intenderci). Ma il sistema operativo può far dipendere così tanto il risultato di un calcolo?
Non si capisce granché.. Che calcolo stai facendo? La versione di Matlab è esattamente la stessa? La differenza sembra tanta ma forse il problema è nel tipo di calcoli che stai facendo.
Allora, è un calcolo di un centinaio di indici di posizione (medie, dev std, etc.). Uso Matlab 2013 a 32 bit su macchine sia a 32 bit che a 64 bit, tutte windows. Ho notato che non è solo un effetto dei 32 vs 64 bit, ma ho ho trovato differenze anche passando da windows 8.1. a windows 10 entrambi a 64bit.
Se non posti codice o altre cose è difficile poterti aiutare. Anche se la cosa migliore che potresti fare è di sottoporre il bug all'azienda stessa, magari riportando la reproducibilità del bug (ovvero mandagli codice, screenshot dei risultati differenti etc..). In informatica la reproducibilità dei bug è una cosa fondamentale
Sono migliaia di righe...
Volevo sapere solo se può capitare una cosa del genere.
Contatto Mathworks.
Grazie
Volevo sapere solo se può capitare una cosa del genere.
Contatto Mathworks.
Grazie
Potrebbe succedere. ma la differenza sembra comunque tanta (troppa forse).
Quali sono i fattori che dovrei considerare per discernere il ruolo del sistema operativo secondo voi?
la RAM?
la scheda grafica?
se i dati sono sulla macchina o su una penna?
il codice lavora mediante GUI con l'utente. Forse questo può far dipendere qualcosa?
grazie di nuovo e grazie anche per le risposte precedenti
la RAM?
la scheda grafica?
se i dati sono sulla macchina o su una penna?
il codice lavora mediante GUI con l'utente. Forse questo può far dipendere qualcosa?
grazie di nuovo e grazie anche per le risposte precedenti
Dubito che c'entri qualcosa il sistema operativo. Infatti non penso che MATLAB usi librerie di sistema per i calcoli, sia perché i sistemi operativi non li forniscono (ok, gnu fornisce alcune librerie di questo tipo) sia perché se lo facesse nessuno comprerebbe MATLAB invece di octave (che in quel caso avrebbe accesso alle stesse identiche librerie).
Pertanto immagino che sia legato alla versione di MATLAB installata e la versione di alcune librerie che linka. Ma senza sapere che cosa stai lanciando è difficile sapere cosa potrebbe essere. Mi auguro che la versione più nuova dia i risultati corretti, in teoria i risultati non dovrebbero cambiare di molto (a meno che non vengano usati due algoritmi diversi, uno dei quali più stabile numericamente). In un certo senso hai trovato un bug in MATLAB.
Pertanto immagino che sia legato alla versione di MATLAB installata e la versione di alcune librerie che linka. Ma senza sapere che cosa stai lanciando è difficile sapere cosa potrebbe essere. Mi auguro che la versione più nuova dia i risultati corretti, in teoria i risultati non dovrebbero cambiare di molto (a meno che non vengano usati due algoritmi diversi, uno dei quali più stabile numericamente). In un certo senso hai trovato un bug in MATLAB.
Come ti abbiamo già detto non abbiamo abbastanza dati per darti una risposta su quale potrebbe essere la causa. Alcune idee potrebbero essere:
1. Le libreria usate (credo che Matlab utilizzi MKL della Intel per i calcoli matriciali) hanno un comportamento diverso a seconda del processore. Nel caso di MKL è in effetti vero in quanto chiama le versioni delle funzioni ottimizzate per il processore.
2. Matlab fa ottimizzazioni del codice in base al processore usato (non credo, ma non ho modo di saperlo). Il riordino delle operazioni può tuttavia portare a differenze nel risultato quando si usano numeri in virgola mobile.
3. I dati vengono letti da file e la libreria usata su ogni sistema operativo è diversa e legge quindi valori simili ma non uguali.
4. Il calcolo fa uso di una funzione bacata di Matlab (o altro)
5. C'è un bug nel codice Matlab il cui comportamento dipende dal particolare sistema in cui gira.
6. I valori forniti dall'utente non sono del tutto uguali tra le varie versioni.
In ogni caso, a meno che i problemi non sia uno tra 4 5 o 6, mi viene da pensare che il codice stesso non sia scritto comunque granché bene. Il calcolo è cioè molto probabilmente poco robusto. In tutti i primi casi la differenza tra i valori dovrebbe comunque essere molto bassa. Stiamo parlando di differenze dopo diverse cifre decimali.. Ma se il risultato cambia anche di due volte a seguito di queste piccole differenze, allora c'è un grosso problema. Matlab è insomma a mio parere l'ultimo dei tuoi problemi.
1. Le libreria usate (credo che Matlab utilizzi MKL della Intel per i calcoli matriciali) hanno un comportamento diverso a seconda del processore. Nel caso di MKL è in effetti vero in quanto chiama le versioni delle funzioni ottimizzate per il processore.
2. Matlab fa ottimizzazioni del codice in base al processore usato (non credo, ma non ho modo di saperlo). Il riordino delle operazioni può tuttavia portare a differenze nel risultato quando si usano numeri in virgola mobile.
3. I dati vengono letti da file e la libreria usata su ogni sistema operativo è diversa e legge quindi valori simili ma non uguali.
4. Il calcolo fa uso di una funzione bacata di Matlab (o altro)
5. C'è un bug nel codice Matlab il cui comportamento dipende dal particolare sistema in cui gira.
6. I valori forniti dall'utente non sono del tutto uguali tra le varie versioni.
In ogni caso, a meno che i problemi non sia uno tra 4 5 o 6, mi viene da pensare che il codice stesso non sia scritto comunque granché bene. Il calcolo è cioè molto probabilmente poco robusto. In tutti i primi casi la differenza tra i valori dovrebbe comunque essere molto bassa. Stiamo parlando di differenze dopo diverse cifre decimali.. Ma se il risultato cambia anche di due volte a seguito di queste piccole differenze, allora c'è un grosso problema. Matlab è insomma a mio parere l'ultimo dei tuoi problemi.
Grazie di nuovo.
In effetti potrebbe essere il codice scritto male.
Nel caso, quali strumenti devo utilizzare per valutare le performance del codice così da testare questa ipotesi?
metrixo
In effetti potrebbe essere il codice scritto male.
Nel caso, quali strumenti devo utilizzare per valutare le performance del codice così da testare questa ipotesi?
metrixo
Tanto per cominciare sarebbe utile poter confrontare i risultati con valori che sai essere corretti. Inoltre provare a modificare di poco l'input e vedere quanto cambiano i risultati.
Sì, il confronto dei risultati rispetto alla variazione dei dati iniziali è utile. Non mi è troppo facile fare queste variazioni manualmente, devo recuperare dei dati adatti a questo.
Spulciando il sito di Mathworks sono incappato in una domanda simile alla mia mia e una delle risposte indica il compilatore di C come colpevole. In effetti nella cartella che contiene tutto il codice (suddiviso in diversi file Matlab) esistono diversi file .c . Ora, - se preferibile apro un thread ad hoc - , è possibile che questi file, compilati verosimilmente qualche anno fa in un sistema a 32bit, causino differenti risultati adesso che sto usando il codice, nel medesimo ambiente perché è sempre Matlab a 32bit, ma con sistemi operativi windows diversi, sia a 32 che a 64 bit?
Tra l'altro, cosa assai curiosa, io replico esattamente gli stessi risultati sul mio pc portatile (con windows 10) e con un fisso d'ufficio (con window 8.1 PRO), mentre ciò non avviene con un portatile con windows 8.1 (non PRO) e con un XP 2002 PRO a 32bit.
Se il problema è nella ricompilazione di questi sorgente C, allora potrebbe essere controllabile e spiegabile il motivo delle differenze dei risultati dei calcoli.
Grazie di nuovo per qualsiasi suggerimento.
metrixo
Spulciando il sito di Mathworks sono incappato in una domanda simile alla mia mia e una delle risposte indica il compilatore di C come colpevole. In effetti nella cartella che contiene tutto il codice (suddiviso in diversi file Matlab) esistono diversi file .c . Ora, - se preferibile apro un thread ad hoc - , è possibile che questi file, compilati verosimilmente qualche anno fa in un sistema a 32bit, causino differenti risultati adesso che sto usando il codice, nel medesimo ambiente perché è sempre Matlab a 32bit, ma con sistemi operativi windows diversi, sia a 32 che a 64 bit?
Tra l'altro, cosa assai curiosa, io replico esattamente gli stessi risultati sul mio pc portatile (con windows 10) e con un fisso d'ufficio (con window 8.1 PRO), mentre ciò non avviene con un portatile con windows 8.1 (non PRO) e con un XP 2002 PRO a 32bit.
Se il problema è nella ricompilazione di questi sorgente C, allora potrebbe essere controllabile e spiegabile il motivo delle differenze dei risultati dei calcoli.
Grazie di nuovo per qualsiasi suggerimento.
metrixo
È possibile che Matlab utilizzi opzioni del compilatore diverse a seconda del sistema sul quale dovrebbe girare il tuo programma. Opzioni diverse possono portare ad un ordine diverso delle operazioni che possono a loro volta portare a delle differenze nel risultato. Non ho idea di come si possa controllare questo processo in quanto non ho mai lavorato con file C in matlab.
Grazie apatriarca.
Purtroppo non ho scritto io il programma, quindi tra quasi assenza di commenti nel codice e i problemi di cui sopra, faccio fatica a venire a capo alla soluzione. Non conosco anche io il modo in cui Matlab tratti i file c. Ho usato poco C anche in passato, e dunque non ne capisco neanche troppo. La cosa che mi viene in mente più pratica è quella di ricompilare i sorgenti C. Ma allora con quale compilatore? Qualunque sia, credo che debba essere uguale per ogni macchina a questo punto.
Ripeto, se devo aprire un thread dedicato alla gestione dei file .c in Matlab lo faccio.
metrixo
Purtroppo non ho scritto io il programma, quindi tra quasi assenza di commenti nel codice e i problemi di cui sopra, faccio fatica a venire a capo alla soluzione. Non conosco anche io il modo in cui Matlab tratti i file c. Ho usato poco C anche in passato, e dunque non ne capisco neanche troppo. La cosa che mi viene in mente più pratica è quella di ricompilare i sorgenti C. Ma allora con quale compilatore? Qualunque sia, credo che debba essere uguale per ogni macchina a questo punto.
Ripeto, se devo aprire un thread dedicato alla gestione dei file .c in Matlab lo faccio.
metrixo
"metrixo":
Grazie apatriarca.
Purtroppo non ho scritto io il programma, quindi tra quasi assenza di commenti nel codice e i problemi di cui sopra, faccio fatica a venire a capo alla soluzione. Non conosco anche io il modo in cui Matlab tratti i file c. Ho usato poco C anche in passato, e dunque non ne capisco neanche troppo. La cosa che mi viene in mente più pratica è quella di ricompilare i sorgenti C. Ma allora con quale compilatore? Qualunque sia, credo che debba essere uguale per ogni macchina a questo punto.
Ripeto, se devo aprire un thread dedicato alla gestione dei file .c in Matlab lo faccio.
metrixo
Sarà una curiosità che non riesco a frenare.. ma a cosa serve questo programma? a chi è destinato?