ВС13 / ЛабРаб / Пример параллельной программы.doc / Пример параллельной программы
.docПример параллельной программы, написанной на языке С с использованием библиотеки стандарта MPI в модели SPMD
-
Приведённая в таблице, в первой колонке, программа, предназначена для выполнения на двух параллельных процессах.
-
В первой колонке приведён исходный текст программы для исполнения в SPMD модели (Single Program Multi Data).
-
Во второй и третьей колонках приводится гипотетический текст программы, эквивалентный исходному тексту по функциональности, как если бы он был написан отдельно для каждого из двух процессов.
-
Каждый из двух процессов заполняет половину массива а (нулевой от 0 до 49 элемента, а первый от 50 до 99 элемента) номером процесса. После это первый процесс пересылает нулевому свою половину массива и нулевой выводит весь массив целиком на стандартный вывод.
Исходный текст программы |
Реально исполняемый текст программы |
|
|
В процессе 0 |
В процессе 1 |
#include <stdio.h> #include "mpi.h" void main(int argc, char ** argv) { int myrank, size.i; inta{100]; MPI_Status status; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COM_MWORLD, &myrank); MPI_Comm_size (MPI_COMM_WORLD, &size); for (i=(mt)myrank*(100/size); i<(int)(myrank+l)*(IOO/size); i++) a[i]=myrank; if(myrank==0) { MPI_Recv(&a[50], 100/size,MPI_INT, 1,0,MPI_COMM_WORLD.&status); for(i=0;i<100;i++) printf("%d ",a[i]); } if(myrank==l) { MPI_Send(&a[50],100/size, MPI_INT,0,0, MPI_COMM_WORLD); } MPI_Finalize (); } |
#include <stdio.h> #include "mpi.h" void main(int argc, char ** argv) { int myrank, size.i; inta{100]; MPI_Status status; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COM_MWORLD, &myrank); MPI_Comm_size (MPI_COMM_WORLD, &size); for (i=0; i<50; i++) a[i]=myrank;
MPI_Recv(&a[50], 100/size,MPI_INT, 1,0,MPI_COMM_WORLD.&status); for(i=0;i<100;i++) printf("%d ",a[i]);
MPI_Finalize (); } |
#include <stdio.h> #include "mpi.h" void main(int argc, char ** argv) { int myrank, size.i; inta{100]; MPI_Status status; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COM_MWORLD, &myrank); MPI_Comm_size (MPI_COMM_WORLD, &size); for (i=50; i<100; i++) a[i]=myrank;
MPI_Send(&a[50],100/size, MPI_INT,0,0, MPI_COMM_WORLD);
MPI_Finalize (); } |