2011-07-25 11 views
5

Mi scuso in anticipo che non ho il giusto gergo per descrivere il mio problema e che probabilmente non ho dato abbastanza informazioni.GCC 4.5/Ubuntu 11.04 è un codice auto-threading?

Ho eseguito il mio codice MPI sotto gcc 4.4 e OpenMPI/MPICH2 per mesi senza alcun problema su una varietà di piattaforme. Recentemente ho aggiornato un set di server e il mio desktop su Ubuntu 11.04 (eseguendo gcc 4.5 ora) e ho eseguito un 8 task su un nodo con 8 processori. In genere vedo quasi il 100% di utilizzo della CPU utente, e ora vedo solo il 60% di CPU utente e oltre il 30% di CPU di sistema. Questo porta a un notevole rallentamento del mio codice quando viene eseguito in questo modo.

Indagando ulteriormente, ho semplicemente eseguito un lavoro seriale e ho notato che il processo riportava 150 +% di tempo di CPU in uso. Quindi, il mio programma era basato sul multithreading su molti processori. Ho verificato questo esplicitamente usando 'ps -eLF' e osservando i carichi per processore.

Questa è una cosa incredibilmente negativa e inefficiente per il mio codice MPI, e non ho idea da dove provenga. Nulla è cambiato se non il passaggio a Ubuntu 11.04 e gcc 4.5. Ho verificato questo rispetto alle diverse versioni di OpenMPI.

Ho spostato anche i binari tra due macchine compatibili binarie. Se compilo su un'altra macchina (ubuntu 10.10/gcc 4.4) ed eseguo lì, va tutto bene. Spostando il file binario sulla macchina Ubuntu 11.04, lo stesso binario inizia a eseguire il threading stesso.

Vale la pena notare che ho disabilitato esplicitamente tutte le ottimizzazioni (-O0), pensando che il mio valore predefinito (-O3) potrebbe includere qualcosa che non ho capito in 4.5. Ottengo il comportamento identico indipendentemente dal livello di ottimizzazione.

Per favore fatemi sapere quali ulteriori informazioni che posso fornire per determinare la fonte di questo problema.

* INFORMAZIONI AGGIUNTIVE *

Risultati di LDD in risposta alla richiesta. Semplicemente, è OpenMPI, libconfig, e ScaLAPACK, insieme con roba gcc di serie:

linux-vdso.so.1 => (0x00007ffffd95d000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2bd206a000) 
libconfig.so.8 => /usr/lib/libconfig.so.8 (0x00007f2bd1e60000) 
libscalapack-openmpi.so.1 => /usr/lib/libscalapack-openmpi.so.1 (0x00007f2bd151c000) 
libmpi.so.0 => /usr/lib/libmpi.so.0 (0x00007f2bd126b000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2bd0ed7000) 
libblacsCinit-openmpi.so.1 => /usr/lib/libblacsCinit-openmpi.so.1 (0x00007f2bd0cd4000) 
libblacs-openmpi.so.1 => /usr/lib/libblacs-openmpi.so.1 (0x00007f2bd0aa4000) 
libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f2bd022f000) 
liblapack.so.3gf => /usr/lib/liblapack.so.3gf (0x00007f2bcf639000) 
libmpi_f77.so.0 => /usr/lib/libmpi_f77.so.0 (0x00007f2bcf406000) 
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f2bcf122000) 
libopen-rte.so.0 => /usr/lib/libopen-rte.so.0 (0x00007f2bceed3000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2bcecb5000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f2bd22fc000) 
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2bcea9f000) 
libopen-pal.so.0 => /usr/lib/libopen-pal.so.0 (0x00007f2bce847000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2bce643000) 
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2bce43f000) 

Tutto il meglio.

+0

Quali librerie sono usate dal tuo codice? Puoi mostrare i risultati di 'ldd your_programme' per la versione seriale? – osgx

+0

sicuro. è MPI, libconfig e scalapack. ho aggiunto i risultati di ldd al post principale. ognuna di queste librerie ho usato dagli archivi apt e le ho costruite su entrambe le piattaforme (le buone piattaforme 4.4 e bad 4.5). nulla sembra cambiare nulla riguardo al comportamento. – coastal

+0

mi sono reso conto che i risultati erano per la versione parallela. non ho mai costruito una versione seriale, l'MPI è cotto in forno. Noterai molte altre cose lì, quello che mi riguarda di più è libpthread anche se il mio makefile non collega mai esplicitamente quella libreria, quindi dovrei vedere dove vengono le cose del genere . tuttavia, se prendo questo binario, compilato in gcc 4.5 con queste librerie, ed eseguito su un'installazione ubuntu 10.10 compatibile con i binari, tutto si comporta come previsto. tutto con le stesse librerie. è veramente strano – coastal

risposta

1

è possibile che si stia utilizzando questa funzione? http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

In pratica, alcune routine di libreria standard hanno implementazioni parallele. Tuttavia, viene attivata solo quando viene definita la macro _GLIBCXX_PARALLEL.

+0

questo programma è scritto interamente in C, non in C++, e non sto usando nulla disponibile in C1X, ecc. Tutto è rigoroso C99. certamente non ho definito una tale macro. – coastal

1

Vedere il 60%/40% non dice nulla, forse l'elaborazione è solo spiegata in modo diverso. L'unica cifra interessante qui sarebbe quella di confrontare il tempo di wallclock dell'esecuzione totale del tuo codice.

Inoltre, penserei che (se così fosse) non è il proprio file binario che è parallelizzato ma le librerie MPI. Per verificare che non si debba solo compilare il codice sull'altro computer ma anche collegarlo staticamente. Solo così puoi essere sicuro di eseguire esattamente lo stesso codice binario in tutti i suoi aspetti sull'altra macchina.

Quindi, anche non si può essere sicuri che la libreria MPI non usi C++ sotto il cofano. Ricordo che era piuttosto difficile per una delle librerie MPI (non ricordo quale) convocare per non compilare l'interfaccia C++, anche se stavi facendo C.

+0

L'elaborazione non è contabilizzata in modo diverso. C'è un rallentamento molto evidente nel codice stesso. L'esecuzione di 8 attività è inferiore alla metà della velocità su Ubuntu 11.04 rispetto a 10.10. Trovo difficile credere che un sistema progettato per la parallelizzazione esplicita della memoria non condivisa possa estrapolare copie del mio codice, anche quando viene eseguito ** senza ** MPI, come nel caso seriale che menziono nel mio post originale. Le versioni identiche di MPI sono state compilate da me in modo identico su entrambe le piattaforme senza alcun effetto. La versione di repository apt di MPI produce lo stesso comportamento. – coastal

+0

Questa sarebbe stata una informazione interessante che avresti potuto dare nella tua domanda. –

+0

Aggiungerò queste informazioni al post originale come suggerito. – coastal

Problemi correlati