MPI_Scatter и MPI_Gather с помощью std :: vector - PullRequest
0 голосов
/ 12 октября 2018

Я новичок в программировании MPI.Я использую C ++, так как я хочу использовать вектор вместо массива (чтобы пользователь мог динамически выбирать размер сетки для игры (игра жизни Конвея) вместо жестко заданного размера массива).

ПРИНЯТЬ: есть 4 процесса (p = 4)

Вот мой код:

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &p); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

vector<CELL> *gameBoard = NULL;

if (rank == 0)
{
    //create the gameboard on just the root process
    gameBoard = new vector<CELL>();
    gameBoard->resize(16);
}

//create a partialGrid on EACH process
vector<CELL> *partialGrid = new vector<CELL>();
partialGrid->resize(4);

int partialSize = 4;

MPI_Scatter(gameBoard, partialSize, mpi_cell, partialGrid, partialSize, mpi_cell, 0, MPI_COMM_WORLD);

//do something on each process
cout << "HI!!! I'm scattered process number " << rank << endl;
//ideally, do something to the sub vector here (once it works)

vector<CELL> *rbuf = NULL; //Just make null for all other processes. Valid receive buffer only needed for root (rank = 0)

if (rank == 0)
{
    //make sure the receiving buff is created (for just the root rank 0)
    vector<CELL> *rbuf = new vector<CELL>();
    rbuf->resize(16);
    cout << "RANK 0 TEST!" << endl;
}

MPI_Gather(&partialGrid, (pow(n, 2) / p), mpi_cell, &rbuf, (pow(n, 2) / p), mpi_cell, 0, MPI_COMM_WORLD);

Цель (на данный момент жестко закодировать) разделить наш вектор из 16 элементов на 4 субвекторапо одному на каждый из наших 4 процессов.

Я думаю, что моя логика с рангом 0 верна.Я создаю только буфер приема для MPI_Gather в процессе ранга и создаю подвектор для КАЖДОГО процесса до MPI_Scatter.Я пробовал множество вещей и MPI_Scatter всегда терпит неудачу.Пожалуйста, помогите!

Примечание: CELL - это struct из девяти int значений.mpi_cell - это пользовательский тип, который я создал в своей программе MPI.Для простоты исключен код, но вы можете заменить CELL на int и mpi_cell на MPI_INT, если хотите протестировать.

Я получаю ошибку сегментации:

enter image description here

1 Ответ

0 голосов
/ 12 октября 2018

Поскольку asynts отмечено в комментарии, ваши new s неверны.Правильный способ использования std::vector следующий:

std::vector<CELL> gameBoard;
if (rank == 0)
    gameBoard.resize(16);

std::vector<CELL> partialGrid;
partialGrid.resize(4);

MPI_Scatter(gameBoard.data(), 4, mpi_cell, partialGrid.data(), 4, mpi_cell, 0, MPI_COMM_WORLD);

// ...

std::vector<CELL> rbuf;
if (rank == 0)
    rbuf.resize(16);

MPI_Gather(partialGrid.data(), 4, mpi_cell, rbuf.data(), 4, mpi_cell, 0, MPI_COMM_WORLD);

Для простоты я также жестко закодировал все константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...