Использование вектора в MPI (C ++) - PullRequest
8 голосов
/ 30 марта 2010

Я новичок в программировании MPI, изучение стиля, я добился успеха до создания производных типов данных путем определения структур. Теперь я хочу включить Vector в свою структуру и отправить данные через Процесс. Например:

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)

Ответы [ 5 ]

11 голосов
/ 30 марта 2010

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

std::vector<float> data;
// ... add elements to your vector ...
MPI_Send(&data.front(), data.size(), MPI_FLOAT, 0, 1, MPI_COMM_WORLD);
0 голосов
/ 05 января 2012

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

0 голосов
/ 05 апреля 2010

Я делаю то, что вы делаете, и я знаю, что моя архитектура процессора однородна. Я избегаю большого количества перестановок байтов и большого количества упаковки и распаковки 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 голосов
/ 02 апреля 2010

Я описываю свое решение подобной проблемы здесь:

Передача сообщений Графики произвольных объектов?

Помните, что вы можете создавать собственные типы данных MPI из предварительно определенных пользовательских типов данных MPI. Например, вы можете определить структуру, которая описывает макет и содержимое одного экземпляра структуры, а затем вектор из этих типов данных структуры для всего вектора объектов. Черт возьми, если у вас есть несколько таких векторов, вы можете создать третий уровень абстракции, создав тип данных HIndexed из Векторов структур, а затем отправить их всех одним сообщением.

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

0 голосов
/ 30 марта 2010

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

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

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

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

...