2010-03-30 4 views
8

Jestem nowicjuszem w programowaniu MPI, uczeniu się przez stiil, odniosłem sukces do tworzenia pochodnych typów danych poprzez definiowanie struktur. Teraz chcę włączyć wektor w mojej strukturze i chcę wysłać dane w całym procesie. na przykład:Wykorzystanie wektorów w 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 

Teraz za pomocą MPI chcę wysłać dane w strukturze przez procesy. Czy możliwe jest tworzenie wektorów MPI_type_struct i przesyłanie danych?

Próbowałem czytać na forach, ale nie jestem w stanie uzyskać klarownego obrazu z podanych tam odpowiedzi. Mam nadzieję, że będę w stanie uzyskać jasny pomysł lub podejście do wysyłania danych. PS: mogę wysyłać dane indywidualnie, ale jest to obciążenie związane z wysyłaniem danych za pomocą może MPI_Send/Recieve, jeśli uznamy domenę za bardzo dużą (powiedzmy 10000 * 10000)

Odpowiedz

10

Definiowanie struktur w MPI to ból. Myślę, że łatwiejszym rozwiązaniem byłoby wykorzystanie faktu, że wektory STL mają zagwarantowaną ciągłą alokację pamięci. Oznacza to, że możesz traktować je jak tablice C, pobierając wskaźnik do pierwszego elementu.

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

Dziękuję za szybką odpowiedź, problem tutaj chcę wysłać całą strukturę w tym samym czasie zamiast wysyłania pojedynczej zmiennej wektorów i innych typów danych, zmniejszając w ten sposób narzut komunikacji między procesami ... i mam 10 wektorów do być wysyłane przez komunikację .... stąd prowadzi to do powolnego czasu obliczeń i tam, zmniejszając wydajność – lsk1985

+0

@ lsk1985, OK Nie jestem wystarczająco doświadczony z MPI, aby być bardzo pomocny. Przepraszam. Po prostu staram się unikać wysyłania wskaźników pomiędzy procesami (zamiast danych, które wskazują). –

+0

Jeśli masz tablicę wskaźników, utwórz MPI_Type_hindexed, który jest wierszem bloków, z przesunięciem wyrażonym w bajtach. Wystarczy trochę arytmetyczna adresu. –

-2

Z pewnością nie jestem ekspertem od struktury danych MPI, ale nie sądzę, aby to można było zrobić. Powodem jest to, że masz strukturę ze wskaźnikami danych, które chcesz wysłać. Wszystkie funkcje typu danych MPI zakładają, że dane, które chcesz wysłać, znajdują się w ciągłym obszarze pamięci. Jeżeli wektory mają ustalonej maksymalnej wielkości, i można zrobić

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

a następnie wysłać tylko te elementy, które są wypełnione.

Alternatywnie, można pakować dane samodzielnie na jednej tablicy przed kontrolą wyślij i wyślij tablicę. Trzeba będzie zrobić profilowanie, aby sprawdzić, czy jest to szybsze niż wykonywanie oddzielnych wysyłek.

+0

tak, muszę spróbować sprawdzić, czy wysyłanie pojedynczych wektorów działa prostsze, Dzięki za sugestię – lsk1985

+1

"Wszystkie funkcje typu danych MPI zakładają, że dane, które chcesz wysłać, znajdują się w ciągłym obszarze pamięci." - podczas gdy jest to prawdą, możesz zdefiniować niestandardowe typy danych MPI, które reprezentują dowolny układ pamięci (zobacz moją odpowiedź). Tak więc możesz zdefiniować typ danych ze swoich wskaźników, a następnie wysłać wiadomość jako pojedynczą instancję tego typu danych, uzyskując w ten sposób wymagany wynik. – suszterpatt

0

opiszę moje rozwiązanie z podobnym problemem:

Message Passing Arbitrary Object Graphs?

Pamiętaj, że możesz tworzyć niestandardowe typy danych MPI z prevoiusly określonych typów danych zwyczaj MPI. Na przykład można zdefiniować strukturę, która opisuje układ i zawartość pojedynczego wystąpienia struktury, a następnie wektor z tych struktur danych dla całego wektora obiektów. Heck, jeśli masz kilka takich wektorów, możesz utworzyć trzecią warstwę abstrakcji, tworząc HIndexed datatype z Vectors of Structs, a następnie wysłać je wszystkie za pomocą jednej wiadomości.

W powyższym wpisie znajdują się linki do opisów różnych niestandardowych typów danych MPI, które powinny pomóc w podjęciu decyzji o właściwym podejściu.

+0

Dzięki za link i twój pomysł, jak podejść do problemu – lsk1985

0

Robię rzeczy, które robisz, i wiem, że moja architektura procesorów jest jednolita. Unikam wielu zamiany bajtów i mnóstwa pakowania i rozpakowywania MPI przy użyciu Boost serialization.

Wysyłanie:

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); 

przyjmującej:

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

Nie mam pojęcia na temat Boost Serialization, może potrzebuję poświęcić trochę czasu na zrozumienie tego i zobaczę, czy to rozwiązuje problem, który mam. Dzięki za twoją sugestię – lsk1985

0

Hmm ...Przesyłanie struktury C/C++ jako strumienia danych działa tylko wtedy, gdy masz gwarancję, że układ danych na wszystkich komputerach uczestniczących jest dokładnie taki sam. Zasadniczo to nie zadziała. Poza tym są ludzie, którzy twierdzą, że wysłanie struktury spakowanej jako typ danych pochodnych MPI to +1 dla jasności kodu i pokazanie intencji.