Выбераем язык который будем изучать первым. (с моей помощью)
По какому языку будет первый FAQ.
// Сортировка разрезанного массива с пересылкой по одному крайнему элементу
// с использованием одномерной незамкнутой декартовой топологии (линейка)
#include<stdio.h>
#include<mpi.h>
#include<math.h>
#include<sys/time.h>
#define N 10
double M[N];
double qwe,x,minn,maxx;
int flag,flag1,flag2,fl1,fl2,stop,jj;
int main(int argc,char *argv[])
{ int i,j,k,size,rank,sour,dest;
MPI_Status status;
MPI_Comm line;
int dims[1],period[1],reord,iop;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&size);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
dims[0]=size;
period[0]=0;
reord=0;
// создание декартовой топологии "линейка"
MPI_Cart_create(MPI_COMM_WORLD,1,dims,period,reord,&line);
// получение номеров соседей
MPI_Cart_shift(line,0,1,&sour,&dest);
// инициализация массива
for(i=0;i<N;i++) M[i]=rank+i;
// сортировка локального массива
for(i=0;i<N;i++)
for(j=N-1;j>i-1;j--)
if (M[j-1]>M[j]) { x=M[j-1]; M[j-1]=M[j]; M[j]=x; }
// сортировка
do
{ flag=0; flag1=0; flag2=0;
// передача граничных элементов
if(rank!=0)
{ MPI_Send(&M[0],1,MPI_DOUBLE,sour,12,line);
MPI_Recv(&maxx,1,MPI_DOUBLE,sour,13,line,&status);
}
if(rank!=size-1)
{ MPI_Send(&M[N-1],1,MPI_DOUBLE,dest,13,line);
MPI_Recv(&minn,1,MPI_DOUBLE,dest,12,line,&status);
}
// упорядочивание новых элементов относительно остальных
if(rank!=size-1)
{ j=N-1;
do
{ stop=0;
if (M[j-1]>minn) { M[j]=M[j-1]; stop=1; j=j-1; }
} while(stop!=0);
if(M[j]>minn) { M[j]=minn; flag1=1; }
}
if(rank!=0)
{ j=0;
do
{ stop=0;
if (M[j+1]<maxx) { M[j]=M[j+1]; stop=1; j=j+1; }
if (j==N-1) stop=0;
} while(stop!=0);
if(M[j]<maxx) { M[j]=maxx; flag2=1; }
}
// проверка на отсортированность по всем процессорам
MPI_Allreduce(&flag1,&fl1,1,MPI_INT,MPI_SUM,line);
MPI_Allreduce(&flag2,&fl1,1,MPI_INT,MPI_SUM,line);
MPI_Allreduce(&fl1,&flag,1,MPI_INT,MPI_SUM,line);
} while(flag);
// вывод результата
printf("%d: M= ",rank);
for (j=0;j<N;j++) printf(" %2.0lf",M[j]);
printf("n");
MPI_Finalize();
return 0;
}