ВУЗ:
Составители:
Рубрика:
- 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
Страницы
- « первая
- ‹ предыдущая
- …
- 34
- 35
- 36
- 37
- 38
- …
- следующая ›
- последняя »