2012-07-04 7 views
23

Diciamo che c'è un computer con 4 CPU ognuna con 2 core, quindi totalmente 8 core. Con la mia comprensione limitata penso che tutti i processori condividano la stessa memoria in questo caso. Ora, è meglio usare direttamente openMP o usare MPI per renderlo generale in modo che il codice possa funzionare su entrambe le impostazioni distribuite e condivise. Inoltre, se utilizzo MPI per un'impostazione condivisa, le prestazioni diminuiranno rispetto a openMP?MPI vs openMP per una memoria condivisa

+1

Ciò che è meglio dipende dai tuoi piani futuri per il programma. OpenMP è molto più semplice, però. –

+0

Come detto questa domanda non è costruttiva; 'meglio' è troppo soggettivo perché questo ottenga, secondo gli standard di SO, buone risposte. –

risposta

27

Con la maggior parte delle piattaforme di memoria distribuita oggigiorno composte da nodi SMP o NUMA, non ha senso non utilizzare OpenMP. OpenMP e MPI può perfettamente funzionare insieme; OpenMP alimenta i core su ciascun nodo e MPI comunica tra i nodi. Questo è chiamato programmazione ibrida. È stato considerato esotico 10 anni fa, ma ora sta diventando mainstream in High Performance Computing.

Per quanto riguarda la domanda in sé, la risposta corretta, date le informazioni fornite, è sempre stata la stessa: DIPENDE.

4

Per l'utilizzo su una singola macchina di memoria condivisa come quella, mi sento di raccomandare OpenMP. Semplifica alcuni aspetti del problema e potrebbe essere più veloce.

Se si prevede di passare a una macchina di memoria distribuita, quindi utilizzare MPI. Ti risparmierai risolvendo lo stesso problema due volte.

Il motivo per cui OpenMP potrebbe essere più veloce è perché una buona implementazione di MPI potrebbe essere abbastanza intelligente da rilevare che viene utilizzata in un ambiente di memoria condivisa e ottimizzare il suo comportamento di conseguenza.

3

Solo per un'immagine più ampia, la programmazione ibrida è diventata popolare perché OpenMP beneficia della topologia della cache, utilizzando lo stesso spazio di indirizzi. Poiché MPI potrebbe avere gli stessi dati replicati nella memoria (poiché il processo non può condividere dati) potrebbe risentire dell'annullamento della cache.

D'altra parte, se si partizionano i dati correttamente e ogni processore ha una cache privata, potrebbe arrivare ad un punto in cui il problema si adattava completamente alla cache. In questo caso hai velocità super lineari.

Parlando nella cache, ci sono molto diversi topologia della cache sui recenti processori, e ha sempre: DIPENDE ...

48

Se avete bisogno o volete MPI o OpenMP (o entrambi) dipende fortemente dal tipo dell'applicazione in esecuzione e se il problema è principalmente legato alla memoria o vincolato alla CPU (o entrambi). Inoltre, dipende dal tipo di hardware su cui stai lavorando. Alcuni esempi:

Esempio 1

È necessario parallelizzazione perché siete a corto di memoria, ad esempio, hai una simulazione e la dimensione del problema è così grande che i tuoi dati non si adattano più alla memoria di un singolo nodo. Tuttavia, le operazioni che esegui sui dati sono piuttosto veloci, quindi non hai bisogno di più potenza di calcolo.

In questo caso, probabilmente si desidera utilizzare MPI e avviare un processo MPI su ciascun nodo, sfruttando al massimo la memoria disponibile limitando al minimo la comunicazione.

Esempio 2

Di solito si hanno piccoli set di dati e solo vuole accelerare l'applicazione, che è computazionalmente pesante. Inoltre, non si vuole passare molto tempo a pensare alla parallelizzazione, ma più agli algoritmi in generale.

In questo caso OpenMP è la vostra prima scelta. Hai solo bisogno di aggiungere alcune dichiarazioni qua e là (ad esempio davanti ai tuoi loop for che vuoi accelerare), e se il tuo programma non è troppo complesso, OpenMP farà il resto automaticamente.

Esempio 3

si desidera che tutti. Avete bisogno di più memoria, ad esempio più nodi di calcolo, ma volete anche accelerare i vostri calcoli il più possibile, cioè su più di un core per nodo.

Ora l'hardware entra in gioco. Dalla mia esperienza personale, se hai solo pochi core per nodo (4-8), la penalità legata alle prestazioni creata dal sovraccarico generale dell'utilizzo di OpenMP (cioè l'avvio dei thread OpenMP, ecc.) È più che il sovraccarico del processore interno Comunicazione MPI (cioè invio di messaggi MPI tra processi che effettivamente condividono la memoria e non richiederebbero MPI per comunicare).
Tuttavia, se si sta lavorando su una macchina con più core per nodo (16+), sarà necessario utilizzare un approccio ibrido, ovvero parallelizzare con MPI e OpenMP allo stesso tempo. In questo caso, sarà necessaria la parallelizzazione ibrida per sfruttare appieno le risorse computazionali, ma è anche la più difficile da codificare e mantenere.

Sommario
Se si dispone di un problema che è abbastanza piccolo per essere eseguito su un solo nodo, usare OpenMP. Se sai che hai bisogno di più di un nodo (e quindi sicuramente hai bisogno di MPI), ma preferisci la leggibilità del codice/lo sforzo sulle prestazioni, usa solo MPI. Se l'uso di MPI non ti dà la velocità che desideri/richiedi, devi fare tutto e andare ibrido.

alla tua seconda domanda (nel caso in cui non sia divenuto chiaro):
Se l'installazione è tale che non hai bisogno di MPI a tutti (perché il vostro verrà eseguito sempre su un solo nodo), usare OpenMP come sarà essere più veloce Ma se sai che hai comunque bisogno di MPI, inizierei con quello e aggiungerò OpenMP più tardi, quando saprai di aver esaurito tutte le opzioni di ottimizzazione ragionevoli per MPI.

+1

@ Michael Schlottke: Caro Michael, potresti spiegarmi perché la soluzione ibrida sarebbe più veloce di quella MPI, solo per casi d'uso con due o più nodi, ognuno con 16 o più CPU? Quali sono gli svantaggi dell'utilizzo di MPI solo in questo caso? Grazie mille –

+3

@neil_mccauley Dall'esperienza personale (e guardando esempi di altri gruppi di ricerca), la maggior parte dei codici scientifici utilizza un approccio ibrido quando si cerca di utilizzare pienamente nodi di molti nodi. Soprattutto con il supporto per i thread hardware, sembra logico utilizzare il parallelismo a livello di thread in una certa misura all'interno di un nodo (o anche di un core). Avere un numero elevato di ranghi MPI aumenta la comunicazione, rende le operazioni collettive più costose e (probabilmente più importante) aumenta il consumo di memoria.Se nel tuo caso ha senso, puoi rispondere solo su una base per-macchina per codice. –

+0

@MichaelSchlottke Ho un programma che svolge molti compiti computazionali indipendenti. Ho già implementato la parallelizzazione a livello di loop OpenMP all'interno di ogni attività. Tuttavia, l'accelerazione non è affatto vicina a quella teorica e dipende fortemente dalla lunghezza del loop. La memoria non è un vincolo per me. Nel mio codice, la comunicazione è necessaria solo una volta completata un'attività, che richiede pochi minuti per terminare. Pensi che una soluzione solo MPI (distribuendo i compiti tra i core dei nodi) sarebbe molto più efficiente dell'approccio ibrido per il mio caso d'uso? Molte grazie! –