Domanda

Quindi, io sto trovando le Eigen crash pacchetto quando provo dichiarare una matrice più grande di 10000x10000. Ho bisogno di dichiarare una matrice come questo .. A proposito di 13000x13000 elementi in modo affidabile. Ho eseguito un test come:

for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ )
{
  printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ;
  Eigen::MatrixXd m( tortureEigen, tortureEigen ) ;
}

Si blocca sulla mia macchina (6 GB di RAM) a 14008 elementi.

Sono un po 'deluso! Ho pensato Eigen era come MATLAB o ottava e non deve mandare in crash l'utilizzo di matrici più grandi, anche se non ha colpito il disco o qualcosa del genere ..

E per di più è quando ho eseguito questo test e mantenere TaskMan aperto, il processo che sta creando queste matrici non ha nemmeno utilizzare tale quantità di memoria. rapporti Taskman sotto 2k utilizzo.

Utilizzando Eigen 2.0.15 versione stabile

È stato utile?

Soluzione 2

Tutte le risposte qui sono utili!

Si scopre che durante la compilazione come 32 bit app, Eigen si blocca se si tenta di dichiarare una densa MatrixXd , come mi è stato, più grande di 14000 elementi o giù di lì. L'incidente avviene con _aligned_malloc ritorno 0 in eigen codice alloc (MatrixXd :: ridimensionamento ()), cioè 1,5 GB di contigui, RAM allineato non poteva essere riportata sotto a 32 bit, che ha senso, dato che questa si avvicina alla metà della massima loc memoria indirizzabile. Trovare più di 1,5 GB fuori contiguo di 4.0 diventa veramente difficile, suppongo! Aggiornamento a Eigen 3,0 purtroppo non risolve il problema.

Soluzione # 1

Ok allora, così ho compilato a 64 bit, e sulla mia macchina 6GB, il programma viene eseguito con successo, con la fitta allocazione e la soluzione MatrixXd lavorando bene.

Soluzione # 2

Un'altra soluzione sta usando una DynamicSparseMatrix<double>. Sparse non va in crash su enormi alloc dimensioni, anche se a 32 bit app, ma il supporto API per la risoluzione è un'altra storia (API sembra voler convertire in MatrixXd tipo denso al fine di risolvere, che ci lascia con lo stesso problema originale.)

Altri suggerimenti

eigen sviluppatore qui. Si sarebbe molto meglio fare domande Eigen sui nostri canali di supporto per esempio forum ...; -)

Risposta breve:? Si sta utilizzando fisso o matrici dinamico-size

  • se di dimensioni fisse, passare a dinamico-size (per tali dimensioni enormi, è un gioco da ragazzi in ogni caso)

  • se stai ricevendo il bug con le matrici dinamiche di dimensioni, mi sono sorpreso, ma allo stesso tempo posso vedere dove il valore di 10000 proviene. Ad ogni modo, se si esegue l'aggiornamento a eigen3 (il ramo di sviluppo), il problema sarà andato.

Out of the doc Eigen:

Dense contro sparse: Questa matrice maniglie classe denso, non matrici sparse e vettori. Per matrici sparse e vettori, vedere il modulo Sparse.
matrici dense e vettori sono array usuali strisciamento di coefficienti. Tutti i coefficienti sono memorizzati in un array contiguo ordinario. Questo è diverso matrici sparse e vettori in cui i coefficienti sono memorizzate come un elenco di coefficienti non nulli.

Vediamo, 10000x10000x8 (doppio-Matrix) rende circa 1,5 GB. Quello è circa la dimensione massima di un continuo mucchio di blocco in un sistema operativo a 32 bit, ci si aspetterebbe. Prova matrici sparse.

Se si ha realmente bisogno di tali grandi matrici dense, allora avete avuto abbastanza alcuni altri problemi:? Sarà la fine di calcolo prima della prossima interruzione di corrente

Date le specifiche del vostro hard-ware posso solo supporre si esegue su un sistema operativo a 64 bit.

Si può ancora andare in crash anche se la memoria viene paging nel file di paging. Potrebbe significare la memoria è frammentata, ovvero che il file di paging è ancora troppo piccolo. Se è così, si dovrebbe urtare il file di paging per qualcosa di abbastanza grande come 8 o 12 GB di o giù di lì.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top