- 30 -
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 процессорах программа естественным образом не завершится (ис-
полнение закончится только по истечению отведенного времени).
Раскомментировав строку
//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).
Дополнительные задания (самостоятельная работа студентов):
• усложнить структуру передаваемой в качестве сообщения текстовой
строки (внести номер процесса, имя компьютера, момент времени переда-
чи)
• для посылки сообщения всем процессам использовать функцию рассылки
MPI_Bcast