#include "mpi.h" /*MPI head file*/
#include<time.h>
#include <stdio.h>
#include<stdlib.h>
#define LEN 10000
#define MAXGEN 100
//qsort()使用的比較函數。
int comp(const void*a,const void*b)
{
return (*(int*)b-*(int*)a);
}
int main( int argc, char** argv )
{
int i, rank, size;
//int in[LEN];
int *in = (int *) malloc (sizeof(int)*LEN);
int len2;
int rand1,rand2;
int generation = 0;
//int sendave[LEN], recvave[LEN];
int *sendave = (int *) malloc (sizeof(int)*LEN);
int *recvave = (int *) malloc (sizeof(int)*LEN);
int flag = 1; //標記數組是否已經初始化
double sum=0.0;
MPI_Datatype arrint;
MPI_Status status;
MPI_Init(&argc, &argv); /*initializing */
MPI_Comm_rank(MPI_COMM_WORLD, &rank); /*Process#*/
MPI_Comm_size(MPI_COMM_WORLD, &size); /*Total processes#*/
//自定義進程間通信數據類型
MPI_Type_contiguous( LEN, MPI_INT, &arrint );
//提交數據類型
MPI_Type_commit( &arrint );
srand((unsigned int)time(NULL)+rank);
//循環直到指定代數
while(generation++ < MAXGEN) {
//主進程
if(0 == rank) {
//初始化數組
if(flag) {
for(i=0;i<LEN;i++) {
in[i] = rand()%(LEN);
}
flag = 0;
qsort(in,LEN,sizeof(int),comp);
//顯示排序後的數組內容
printf("祖先代:\n");
for(i=0;i<LEN;i++) {
//printf("%4d ", in[i]);
//if((i+1)%10 == 0) printf("\n");
sum += in[i];
}
printf("ave = %6.3lf\n",sum/LEN);
printf("\n");
}//end if(flag)
}//end if(rank==0)
//將該初始化後的in數組廣播出去(廣播了一個arrint類型的通信數據)
MPI_Bcast(in, 1, arrint, 0, MPI_COMM_WORLD );
//每個進程執行的次數
len2 = LEN*0.4/size;
for(i=0;i<len2;i++) {
//在後1/3處取數據求平均值
rand1 = rand() % LEN/3;
rand2 = rand() % LEN/3;
sendave[i] = (in[rand1] + in[rand2]) / 2.0;
//printf("rank:%d rand1:%d rand2:%d ave:%d \n", rank,rand1,rand2,sendave[i] );
}
//將各進程計算的數據收回代主進程(rank=0進程)
MPI_Gather(sendave,len2,MPI_INT,recvave,len2,MPI_INT,0,MPI_COMM_WORLD);
//等待所有所有進程執行到此才繼續往下執行
MPI_Barrier(MPI_COMM_WORLD);
if(0 == rank) {
//將recvave中的數據放到in的後1/4,並對in排序
for(i=1;i<=LEN*0.4;i++) {
in[LEN-i] = recvave[i-1];
}
qsort(in,LEN,sizeof(int),comp);
//打印子代內容
printf("第%d代:\n",generation);
sum = 0;
for(i=0;i<LEN;i++) {
//printf("%4d ", in[i]);
//if((i+1)%10 == 0) printf("\n");
sum += in[i];
}
printf("ave = %6.3lf\n",sum/LEN);
}//end if(0==rank)
MPI_Barrier(MPI_COMM_WORLD);
}//end while
printf("\n");
MPI_Finalize();
return (0);
}
存在問題: