2010-03-30 18 views
8

Sono un neofita della programmazione MPI, l'apprendimento di stiil, ho avuto successo fino a creare i tipi di dati derivati ​​definendo le strutture. Ora voglio includere Vector nella mia struttura e voglio inviare i dati attraverso il Processo. per esempio:Uso vettoriale in MPI (C++)

struct Structure{ 

//Constructor 
Structure(): X(nodes),mass(nodes),ac(nodes) { 

//code to calculate the mass and accelerations 
} 
//Destructor 
Structure() {} 

//Variables 
double radius; 
double volume; 
vector<double> mass; 
vector<double> area; 

//and some other variables 

//Methods to calculate some physical properties 

Ora utilizzando MPI voglio inviare i dati nella struttura attraverso i processi. È possibile per me creare i vettori MPI_type_struct inclusi e inviare i dati?

Ho provato a leggere i forum, ma non sono in grado di ottenere un'immagine chiara dalle risposte fornite. Spero di essere in grado di ottenere un'idea chiara o un approccio per inviare i dati

PS: posso inviare i dati individualmente, ma è un overhead di inviare i dati utilizzando MPI_Send/Recieve se consideriamo il dominio molto grande (10000 * 10000)

risposta

10

Definire le strutture in MPI è un dolore. Penso che un approccio più semplice sarebbe quello di utilizzare il fatto che i vettori STL sono garantiti per avere memoria allocata in modo contiguo. Cioè, puoi trattarli come array C ottenendo un puntatore al primo elemento.

std::vector<float> data; 
// ... add elements to your vector ... 
MPI_Send(&data.front(), data.size(), MPI_FLOAT, 0, 1, MPI_COMM_WORLD); 
+0

Grazie per la risposta rapida, il problema qui voglio inviare l'intera struttura in una volta invece di inviare una singola variabile di vettore e altri tipi di dati, riducendo così il sovraccarico di comunicazione tra i processi ... e ho 10 vettori per essere inviato attraverso per la comunicazione .... quindi porta a rallentare il tempo di calcolo e lì diminuendo l'efficienza – lsk1985

+0

@ lsk1985, OK, non ho abbastanza esperienza con MPI per essere di grande aiuto allora. Scusate. Farei semplicemente attenzione ad evitare di inviare dei puntatori tra i processi (invece dei dati a cui puntano). –

+0

Se si dispone di un array di puntatori, creare un MPI_Type_hindexed, che è una riga di blocchi, con lo spostamento espresso in byte. Ci vuole solo un piccolo indirizzo aritmetico. –

-2

Non sono certo un esperto di struttura dati MPI, ma non credo che ciò possa essere fatto. La ragione è che fondamentalmente hai una struttura con dei puntatori ai dati da inviare. Tutte le funzioni dei tipi di dati MPI presuppongono che i dati che si desidera inviare si trovino in un'area contigua della memoria. Se i vettori sono di una dimensione massima fissa, e si potrebbe fare

double radius; 
double volume; 
int mass_size; 
int area_size; 
double mass[MASS_MAXLEN]; 
double area[AREA_MAXLEN]; 

e quindi inviare solo gli elementi che sono compilati.

In alternativa, potete imballare i dati da soli in un array prima della invia e invia la matrice. Dovresti fare un po 'di profilazione per vedere se fosse più veloce di fare mandate separate.

+0

sì, ho bisogno di provare e vedere se l'invio di singoli vettori funziona più semplice, Grazie per il suggerimento – lsk1985

+1

"Tutte le funzioni di tipo di dati MPI presuppongono che i dati che si desidera inviare si trovano in un'area contigua di memoria." - mentre questo è vero, è possibile definire i tipi di dati MPI personalizzati che rappresentano un layout di memoria arbitrario (vedere la mia risposta). Pertanto, è possibile definire un tipo di dati dai puntatori, quindi inviare un messaggio come singola istanza di questo tipo di dati, ottenendo così il risultato richiesto. – suszterpatt

0

descrivo la mia soluzione a un problema simile qui:

Message Passing Arbitrary Object Graphs?

Ricordate che è possibile creare tipi di dati MPI personalizzato da tipi di dati MPI personalizzato prevoiusly definiti. Ad esempio, è possibile definire una Struct che descrive il layout e il contenuto di una singola istanza di Structure, quindi un vettore da questi tipi di dati Struct per l'intero vettore di oggetti. Diamine, se si dispone di diversi di questi vettori, è possibile creare un terzo livello di astrazione, creando un tipo di dati HIndexed da Vettori di strutture e quindi inviarli tutti con un singolo messaggio.

Nel post che ho collegato sopra troverete i collegamenti alle descrizioni dei vari tipi di dati personalizzati MPI, che dovrebbero aiutare a decidere l'approccio corretto.

+0

Grazie per il link e la tua idea di come affrontare il problema – lsk1985

0

Faccio cose come te, e so che la mia architettura del processore è omogenea. Evito molti scambi di byte e molti MPI di imballaggio e disimballaggio utilizzando Boost serialization.

Invio:

ostringstream oss; 
    { 
    binary_oarchive oa(oss); 
    oa << BOOST_SERIALIZATION_NVP(myStruct); 
    } 

    MPI::COMM_WORLD.Send(oss.str().c_str(), 
         oss.str().size(), 
         MPI::Datatype(MPI_BYTE), 
         MpiLibWrapper::DEST_PROC_RANK, 
         MpiLibWrapper::MY_STRUCT_TAG); 

Ricezione:

vector<char> incomingBuffer(MAX_BUFFER_SIZE); 

    MPI::COMM_WORLD.Recv(&incomingBuffer[0], incomingBuffer.size(), 
         MPI::Datatype(MPI_BYTE), 
         MpiLibWrapper::SRC_PROC_RANK, 
         MpiLibWrapper::MY_STRUCT_TAG, 
         msgStatus); 
    if (MpiLibWrapper::ErrorOccurred(msgStatus.Get_error(), 
            info.logging)) { 
     break; 
    } 
    incomingBuffer.resize(msgStatus.Get_count(MPI::Datatype(MPI_BYTE))); 

    if (incomingBuffer.size() > 0) { 
     // Shockingly, this does not result in a memory allocation. 
     istringstream iss(string(&incomingBuffer[0], incomingBuffer.size())); 

     binary_iarchive ia(iss); 

     ia >> BOOST_SERIALIZATION_NVP(myStruct); 
    } 
+0

Non ho idea di Serializzazione boost, potrebbe essere necessario dedicare un po 'di tempo a capirlo e vedere se risolve il problema che ho.Grazie per il tuo suggerimento – lsk1985

0

Hmm ...L'invio di struct C/C++ come flusso di dati funziona solo quando è garantito che il layout dei dati su tutte le macchine partecipanti è esattamente lo stesso. In generale, questo non funzionerà. Inoltre, ci sono persone che sostengono che l'invio di una struttura compressa come un tipo di dati derivato da MPI è +1 per la chiarezza del codice e per mostrare l'intento.