2010-03-30 2 views
8

Я новичок в программировании MPI, учебе stiil, я был успешным до создания производных типов данных, определяя структуры. Теперь я хочу включить Vector в свою структуру и хочу отправить данные в Process. например:Использование векторов в 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 

Теперь, используя MPI, я хочу отправить данные в структуру процессов. Возможно ли, чтобы я создал включенные векторы MPI_type_struct и отправил данные?

Я пробовал читать через форумы, но я не могу получить четкое изображение из ответов, представленных там. Надеюсь, что я смогу получить четкое представление или подход к отправке данных.

PS: я могу отправлять данные по отдельности, но его накладные расходы на отправку данных можно использовать в MPI_Send/Recieve, если мы рассмотрим домен очень большой (10000 * 10000)

ответ

10

Определение структур в MPI - это боль. Я думаю, что более простой подход состоял бы в том, чтобы использовать тот факт, что векторы STL гарантированно имеют смежную выделенную память. То есть вы можете обращаться с ними, как с массивами C, получая указатель на первый элемент.

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

Спасибо за быстрый ответ, проблема здесь я хочу отправить всю структуру за один раз вместо отправки одной переменной векторных и других типов данных, тем самым уменьшая коммуникационные издержки между процессами ... и у меня есть 10 векторов для быть отправлен для общения .... следовательно, это приводит к медленному времени вычислений и там, уменьшая эффективность – lsk1985

+0

@ lsk1985, ОК. Я недостаточно опытна с MPI, чтобы оказать вам большую помощь. Сожалею. Я просто буду стараться избегать отправки указателей между процессами (вместо данных, на которые они указывают). –

+0

Если у вас есть массив указателей, создайте MPI_Type_hindexed, который представляет собой строку блоков, с смещением, выраженным в байтах. Это требует лишь небольшой арифметики адресов. –

-2

Я, конечно, не эксперт по структуре данных MPI, но я не думаю, что это можно сделать. Причина в том, что в основном у вас есть структура с указателями на данные, которые нужно отправить. Все функции типа MPI предполагают, что данные, которые вы хотите отправить, находятся в смежной области памяти. Если векторы имеют фиксированного максимального размера, и вы могли бы сделать

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

, а затем отправить только те элементы, которые заполняются в.

В качестве альтернативы, вы могли бы упаковывать их самостоятельно в один массив до проведения отправить и отправить массив. Вам нужно будет сделать некоторые профилирования, чтобы увидеть, было ли это быстрее, чем отдельные отправки.

+0

да, мне нужно попробовать и посмотреть, работает ли передача отдельных векторов проще, спасибо за предложение – lsk1985

+1

«Все функции типа данных MPI предполагают, что данные, которые вы хотите отправить, находятся в смежной области памяти». - хотя это верно, вы можете определить пользовательские типы данных MPI, которые представляют собой произвольный макет памяти (см. мой ответ). Таким образом, вы можете определить тип данных из ваших указателей, а затем отправить сообщение как один экземпляр этого типа данных, таким образом получив требуемый результат. – suszterpatt

0

я описать мое решение подобной проблемы здесь:

Message Passing Arbitrary Object Graphs?

Помните, что вы можете создавать собственную MPI типов данные из prevoiusly определенных типов данных пользовательской MPI. Например, вы можете определить Struct, который описывает макет и содержимое одного экземпляра Structure, а затем Vector из этих типов данных Struct для всего вектора объектов. Если у вас есть несколько таких векторов, вы можете создать третий слой абстракции, создав тип данных HIndexed из Vectors of Structs, а затем отправить их всем одним сообщением.

В сообщении, которое я связал выше, вы найдете ссылки на описания различных пользовательских типов данных MPI, которые помогут вам решить правильный подход.

+0

Спасибо за ссылку и вашу идею о том, как подойти к проблеме – lsk1985

0

Я делаю то, что вы делаете, и я знаю, что моя архитектура процессора однородна. Я избегаю большого количества байтов и большого количества упаковки и распаковки MPI, используя Boost serialization.

Отправка:

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

Принимающий:

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

Я понятия не имею о расширении сериализации, возможно, мне нужно потратить некоторое время на ее понимание и посмотреть, решает ли она проблему, которую я имею. Спасибо за ваше предложение – lsk1985

0

Хм ...Отправка структуры C/C++ как потока данных работает только тогда, когда вам гарантируется, что расположение данных на всех участвующих машинах будет одинаковым. В общем, это не сработает. Кроме того, есть люди, которые утверждали бы, что отправка структуры, упакованной в виде типа данных, полученных MPI, составляет +1 для ясности кода и для демонстрации намерения.

Смежные вопросы