Я новичок в программировании 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
, если хотите протестировать.
Я получаю ошибку сегментации: