Как на самом деле работает MPI_Waitall - PullRequest
2 голосов
/ 22 августа 2011

Не противоречит ли этот пример руководству ?В руководстве говорится, что и массив запросов, и массив статусов должны быть одинакового размера.Чтобы быть более точным, оба массива должны быть не меньше, чем указано аргументом count .Тем не менее в приведенном ниже примере размер массива состояния равен 2, а не 4. Кроме того, этот пример противоречит этому утверждению из руководства

Безошибочное выполнение MPI_Waitall (count, array_of_requests, array_of_statuses) имеет то же самоеэффект как выполнение MPI_Wait (& array_of_request [i], & array_of_statuses [i]), для i = 0, ..., count-1, в некотором произвольном порядке.

#include "mpi.h"
#include <stdio.h>

int main(argc,argv)
int argc;
char *argv[];  {
int numtasks, rank, next, prev, buf[2], tag1=1, tag2=2;
MPI_Request reqs[4];
MPI_Status stats[2];

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

prev = rank-1;
next = rank+1;
if (rank == 0)  prev = numtasks - 1;
if (rank == (numtasks - 1))  next = 0;

MPI_Irecv(&buf[0], 1, MPI_INT, prev, tag1, MPI_COMM_WORLD, &reqs[0]);
MPI_Irecv(&buf[1], 1, MPI_INT, next, tag2, MPI_COMM_WORLD, &reqs[1]);

MPI_Isend(&rank, 1, MPI_INT, prev, tag2, MPI_COMM_WORLD, &reqs[2]);
MPI_Isend(&rank, 1, MPI_INT, next, tag1, MPI_COMM_WORLD, &reqs[3]);

      {  do some work  }

MPI_Waitall(4, reqs, stats);

MPI_Finalize();
}

Определение PSглавное выглядит странно.Возвращаемое значение отсутствует.Это доисторический С или опечатка?

1 Ответ

5 голосов
/ 22 августа 2011

Да, этот пример противоречит руководству.Если вы сравните пример с версией на Фортране, вы увидите, что версия на Фортране верна в том смысле, что массив состояний достаточно большой (как ни странно, это двумерный массив, но благодаря неявным интерфейсам и ассоциации хранилища его можно рассматривать как1D массив размером MPI_STATUS_SIZE * 2, который больше 4, при условии, что MPI_STATUS_SIZE больше 1 (в моей системе это 5).

И да, пропущенный оператор return является ошибкой, однако некоторые компиляторы прибегают только к генерациипредупреждение за пропуск оператора return в main (). Кроме того, доисторичность кода можно увидеть в объявлении аргументов в стиле K & R.

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