OpenMPI 實現CPU並行計算模擬GA算法

#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);
}



存在問題:

發佈了66 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章