Domanda

sto cercando di realizzare il programma master-worker.

Il mio principale ha posti di lavoro che i lavoratori stanno per fare. Ogni volta che un lavoratore compie un lavoro, chiede un nuovo lavoro dal master, e il master invia a lui. I lavoratori stanno calcolando percorsi minimi. Quando un lavoratore non abbia trovato un minimo che è meglio che il minimo globale ha ottenuto, manda a tutti compreso il master.

ho in programma per i lavoratori e padroni di inviare dati utilizzando MPI_ISEND. Inoltre, penso che la ricezione dovrebbe essere il blocco. Il master ha nulla da fare quando nessuno ha chiesto per il lavoro o ha aggiornato il miglior risultato, in modo da dovrebbe bloccare in attesa di una ricezione. Inoltre, ogni lavoratore dovrebbe, dopo che ha fatto il suo lavoro, attesa su una ricezione per ottenere una nuova.

Tuttavia, non sono sicuro del l'impatto dell'utilizzo di non-blocking send asincrona e sincrona bloccando ricevono .

Un'alternativa penso che sta utilizzando MPI_IPROBE, ma non sono sicuro che questo mi darà alcuna ottimizzazione.

Si prega di aiutare a capire se quello che sto facendo è giusto. E 'questa la soluzione giusta?

È stato utile?

Soluzione

Si può abbinare il blocco invia con non bloccante riceve e viceversa, che non causerà alcun problema. Tuttavia, se il master ha davvero nulla a che fare, mentre gli operai lavorano, e gli operai dovrebbero bloccare dopo aver completato la loro unità di lavoro, quindi non c'è motivo per la comunicazione non-blocking su questo fronte. Il master può inviare un blocco accogliere con MPI_ANY_SOURCE, e gli operai può semplicemente utilizzare un invio di blocco di inviare indietro i loro risultati, dal momento che l'abbinamento di ricezione sul master sarà già stato pubblicato.

Quindi, avrei dovuto Send-Recv per lo scambio di unità di lavoro tra master e dei lavoratori, e iSend-Irecv per trasmettere la nuova minimi globale.

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