Perché il mio solutore parallelo è più lento del mio solutore sequenziale?


14

Stavo giocando con PETSc e ho notato che quando eseguo il mio programma con più di un processo tramite MPI sembra funzionare ancora più lentamente ! Come posso verificare per vedere cosa sta succedendo?


Non pubblicarlo come una risposta perché in realtà è un "cosa" piuttosto che un "come", ma in passato ho avuto problemi simili causati da una sezione di codice protetta da mutex a cui si accede da più thread. A volte è necessario verificare il blocco delle risorse condivise dietro le quinte.
David Z,

Risposte:


13

Ciò può derivare da fattori architettonici :

Se la stessa larghezza di banda di memoria è disponibile per uno o più processi, allora non vedrai quasi alcun aumento di velocità poiché SpMV e le relative operazioni di algebra lineare sono limitate.

Potrebbe anche accadere che l'overhead della comunicazione ti travolga dal calcolo locale. Ad esempio, nei metodi iterativi lineari si consiglia di avere almeno 10.000 incognite per processo.

o fattori numerici :

I precondizionatori paralleli sono spesso più deboli delle loro controparti seriali. Ad esempio, il blocco Jacobi diventa più debole più blocchi usi. Pertanto, è necessario tenere conto del tempo extra impiegato per iterazioni lineari extra. Le condizioni non lineari in generale non funzionano in questo modo, quindi le iterazioni di Newton sono spesso costanti.


8

Ogni volta che provi a parallelizzare un programma devi bilanciare una serie di costi, ma principalmente c'è

  • Il costo di esecuzione di ogni calcolo
  • Il costo di eventuali comunicazioni tra tali calcoli
  • Il costo di gestione di tali calcoli

Se i tuoi calcoli sono imbarazzanti parallelamente, il costo delle comunicazioni sarà molto basso (solo input e output) e il costo di gestione dovrebbe essere molto basso.

Se si hanno interdipendenze tra i calcoli, il costo delle comunicazioni può aumentare in modo significativo. Se si dispone di un algoritmo complesso che richiede tempi diversi per il completamento di un determinato calcolo, la complessità di gestione aumenta, mentre si tenta di utilizzare in modo efficiente le risorse disponibili.

Come in ogni forma di ottimizzazione, la chiave è fare un benchmark. Guarda come si comporta senza MPI, come si comporta con MPI e un processo, quindi guarda come si ridimensiona.

Se stai giocando con CUDA, prova a fornire molti più dati. Un test qui ha portato a un aumento di velocità negativo. Gli abbiamo dato 1000 volte più dati e la versione GP-GPU è finita quasi nello stesso tempo, mentre la versione in esecuzione sulla CPU principale ha impiegato 1000 volte di più.


3

Ti consiglierei di fare quanto segue:

  • Crea un profilo dell'esecuzione temporale del tuo codice, con e senza parallelizzazione. Se hai dei dubbi su come farlo, possiamo aiutarti se descrivi meglio il tuo codice.

  • Ora puoi concentrarti sulle parti che funzionano più lentamente in parallelo. Dovresti essere consapevole che la comunicazione tra i processi potrebbe essere lenta. Come hanno sottolineato Mark e Sean, solo perché un problema può essere diviso in thread non significa che farlo sarà efficace. Devi approfondire. Ma se esegui il profilo del tuo codice, potrebbe aiutarti a trovare eventuali bug esistenti. I miei due centesimi.

Se spieghi cosa stai facendo in modo più dettagliato, ad esempio con un flusso di lavoro, qualcuno potrebbe essere in grado di darti una spiegazione migliore.


@ketch: hai ragione. Scusa e grazie per averlo notato. Modificato il testo.
jbcolmenares,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.