Параллельное программирование в стандарте MPI. Баканов В.М - 36 стр.

UptoLike

Составители: 

- 36 -
int main (int argc, char **argv)
{
char message[20];
int i=0, all_rank, my_rank;
MPI_Status status;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &my_rank); // get number current process
MPI_Comm_size (MPI_COMM_WORLD, &all_rank); // all process
if (my_rank==0) /* code for process zero */
{
strcpy (message, "Hello, there!\0");
//for(i=0; i<all_rank; i++)
MPI_Send(message, strlen(message), MPI_CHAR, i, 999, MPI_COMM_WORLD);
}
else /* code for other processes */
{
MPI_Recv(message, 20, MPI_CHAR, 0, 999, MPI_COMM_WORLD, &status);
//MPI_Recv(message, 20, MPI_CHAR, 0, MPI_ANY_TAG, MPI_COMM_WORLD,
// &status);
printf ("I am %d process; received: %s\n", my_rank, message);
}
MPI_Finalize();
} // end of EXAMP_02 program
Так как использована блокирующая функция
MPI_Recv
, при запуске более
чем на 2 процессорах программа корректным образом не завершится (в за-
висимости от используемой версии MPI исполнение закончится c ошибкой
или только по истечению отведенного времени).
Раскомментировав строку
//for(i=0; i<all_rank; i++)
и заменив (сходным обра-
зом
MPI_Recv(message, 20, MPI_CHAR, 0, 999, MPI_COMM_WORLD, &status);
на
MPI_Recv(message, 20, MPI_CHAR, 0, MPI_ANY_SOURCE, MPI_ANY_TAG,
MPI_COMM_WORLD, &status);
, получим на выходе подобные нижеприведен-
ным строки):
I am 2 process; received: Hello, there!
I am 1 process; received: Hello, there!
I am 4 process; received: Hello, there!
I am 3 process; received: Hello, there!
В последнем случае использованы предопределенные MPI-константы
(‘джокеры’)
MPI_ANY_SOURCE
и
MPI_ANY_TAG
, означающиепринимай от
любого источника ипринимай сообщения с любым тегом’. Теперь про-
грамма завершится естественным способом (т.к. будут удовлетворены все
блокирующие вызовы
MPI_Recv
).
                                            - 36 -

int main (int argc, char **argv)
{
 char message[20];
 int i=0, all_rank, my_rank;
 MPI_Status status;
 MPI_Init (&argc, &argv);
 MPI_Comm_rank (MPI_COMM_WORLD, &my_rank); // get number current process
 MPI_Comm_size (MPI_COMM_WORLD, &all_rank); // all process

 if (my_rank==0) /* code for process zero */
 {
   strcpy (message, "Hello, there!\0");
//for(i=0; i