Un compito che ho appena completato richiede la creazione di un set di script in grado di configurare macchine Ubuntu casuali come nodi in un cluster di elaborazione MPI. Tutto ciò è stato fatto e i nodi possono comunicare tra loro correttamente. Tuttavia, vorrei ora dimostrare l'efficienza di detto cluster MPI lanciando un programma parallelo. Sto solo cercando un calcolo lineare della forza bruta che possa dividere il lavoro tra il numero di processi (= nodi) disponibili: se un nodo impiega 10 secondi per eseguire il programma, 4 nodi dovrebbero richiedere solo circa 2,5.Programma dimostrativo parallelo
Con questo in mente ho cercato un primo programma di calcolo scritto in C. Per qualsiasi purista, il programma non è in realtà parte del mio incarico in quanto il corso che sto prendendo è puramente la gestione dei sistemi. Ho solo bisogno di qualcosa che mostrerà che il mio cluster funziona. Ho un po 'di esperienza di programmazione ma poco in C e nessuno con MPI. Ho trovato quite un programma di esempio few ma nessuno di questi sembra essere effettivamente eseguito in parallelo. Distribuiscono tutti i passaggi tra i miei nodi, quindi se un nodo ha un processore più veloce il tempo complessivo andrà giù, ma l'aggiunta di nodi aggiuntivi non fa nulla per accelerare il calcolo.
Sto facendo qualcosa di sbagliato? I programmi che ho trovato semplicemente non sono paralleli? Devo imparare la programmazione C per MPI per scrivere il mio programma? Ci sono altri programmi MPI paralleli che posso usare per dimostrare il mio cluster al lavoro?
EDIT
Grazie alle risposte di seguito sono riuscito a ottenere diversi script MPI di lavoro, tra cui la somma dei primi numeri naturali N (che non è molto utile in quanto corre in tipo di dati limiti), il conteggio e la generazione di numeri primi e il calcolo Monte Carlo di Pi. È interessante notare che solo i programmi di numeri primi realizzano un guadagno di prestazioni (a volte drammatico) con più nodi/processi.
Il problema che ha causato la maggior parte dei miei problemi iniziali nel far funzionare gli script era piuttosto oscuro e apparentemente a causa di problemi con i file host sui nodi. L'esecuzione di mpiexec con il parametro -disable-hostname-propagation
ha risolto questo problema, che può manifestarsi in vari modi: errori di barriera MPI (R), errori di connessione TCP e altri errori di connessione generici. Credo che potrebbe essere necessario che tutti i nodi del cluster si conoscano per nome host, il che non è un problema nei cluster Beowulf classici che hanno DHCP/DNS in esecuzione sul nodo del server.
Una risposta molto interessante. Quando fai riferimento al numero di nodi come fisso, vuoi dire che deve essere conosciuto e rimanere stabile mentre un'operazione è in esecuzione? Edit (pubblicato per errore su tabchange): Sono anche consapevole dei ritorni decrescenti negli scenari del mondo reale, ma ho pensato che per semplici calcoli aritmetici, come l'operazione di somma che suggerisci, dove il lavoro può essere completamente diviso e può funzionare completamente in parallelo, la capacità di prestazione aumenterebbe in misura quasi uguale. – Lilienthal
@Lilienthal hai ragione, la parola "fisso" è un po 'ambigua lì. quello che volevo dire era che il distributore di lavoro MPI genera lo stesso programma su ogni nodo e che nessuna nuova copia aggiuntiva può unirsi alla festa mentre è in esecuzione. –
@Lilienthal hai sempre il sovraccarico di distribuire il lavoro ai nodi che a volte annulla il guadagno di prestazioni per pochi nodi. e per molti nodi, i rendimenti decrescenti crescono esponenzialmente. Inoltre, c'è il problema di misurare le prestazioni sequenziali :) ma sì ... calcoli semplici che richiedono una quantità di tempo misurabile dovrebbero essere velocizzati quasi linearmente dalla parallelizzazione, a condizione che il numero di nodi sia ragionevolmente piccolo. –