?? 并行枚舉排序.cpp
字號(hào):
#include <stdio.h>#include <stdlib.h>#include <mpi.h>/** 函數(shù)名: main* 功能: 主函數(shù),實(shí)現(xiàn)枚舉排序* 輸入:argc為命令行參數(shù)個(gè)數(shù);* argv為每個(gè)命令行參數(shù)組成的字符串?dāng)?shù)組* 輸出:返回1代表程序正常結(jié)束*/int main(int argc,char *argv[]){ int DataSize, MyLength; /*DataSize:數(shù)組長(zhǎng)度;MyLength:處理器分配到的數(shù)據(jù)長(zhǎng)度*/ int *data_in, *data_out; /*輸入和輸出數(shù)組指針*/ int *rank; /*秩數(shù)組*/ int MyID, SumID; int i, j; MPI_Status status; MPI_Init(&argc,&argv); /*MPI 初始化*/ MPI_Comm_rank(MPI_COMM_WORLD,&MyID); /*每個(gè)處理器確定各自ID*/ MPI_Comm_size(MPI_COMM_WORLD,&SumID); /*每個(gè)處理器確定總處理器個(gè)數(shù)*/ if(MyID==0) /*主處理器*/ DataSize=GetDataSize(); /*讀入待排序序列的長(zhǎng)度*/ MPI_Bcast(&DataSize, 1, MPI_INT, 0, MPI_COMM_WORLD); /*主處理器廣播待排序序列的長(zhǎng)度*/ /*在各個(gè)處理器間劃分任務(wù)*/ MyLength=DataSize/SumID; if(MyID==SumID-1) /*每個(gè)處理器確定各自要排序的序列長(zhǎng)度*/ MyLength=DataSize-MyLength*(SumID-1); data_in=(int *)malloc(DataSize*sizeof(int)); /*分配待排序序列的空間*/ if(data_in==0) ErrMsg("Malloc memory error!"); if(MyID==0){ data_out=(int *)malloc(DataSize*sizeof(int)); /*主處理器分配排序后數(shù)組的空間*/ if(data_out==0) ErrMsg("Malloc memory error!"); rank=(int *)malloc(DataSize*sizeof(int)); /*分配序號(hào)數(shù)組的空間*/ if(rank==0) ErrMsg("Malloc memory error!"); } else{ rank=(int *)malloc(MyLength*sizeof(int)); /*分配序號(hào)數(shù)組的空間*/ if(rank==0) ErrMsg("Malloc memory error!"); } if(MyID==0){ int seed; printf("Please Input Seed:"); scanf("%d",&seed); /*獲得隨機(jī)數(shù)的種子*/ srand(seed); printf("Random Numbers:\n"); for(i=0;i<DataSize;i++){ data_in[i]=((int)rand())%10000; /*生成隨機(jī)數(shù),并輸出*/ printf("%10d ",data_in[i]); } printf("\nOutput:"); printf("\n"); } /*向各個(gè)處理器播送待排序序列*/ MPI_Bcast(data_in, DataSize, MPI_INT, 0, MPI_COMM_WORLD); /*各個(gè)處理器分別計(jì)算所屬元素的秩*/ CountRank(data_in,DataSize,MyLength,rank,SumID,MyID); /*從各個(gè)處理器收集已排序好的數(shù)據(jù)*/ if(MyID==0){ for(i=1;i<SumID;i++){ if(i==SumID-1) MPI_Recv(rank+MyLength*i,DataSize-MyLength*(SumID-1),MPI_INT,i,0,MPI_COMM_WORLD,&status); else MPI_Recv(rank+MyLength*i,MyLength,MPI_INT,i,0,MPI_COMM_WORLD,&status); } } else MPI_Send(rank,MyLength,MPI_INT,0,0,MPI_COMM_WORLD); /*根據(jù)所獲得的秩重新定位各個(gè)數(shù)據(jù)*/ if(MyID==0){ for(i=0;i<DataSize;i++) data_out[rank[i]]=data_in[i]; for(i=0;i<DataSize;i++){ printf("%10d ",data_out[i]); } printf("\n"); } MPI_Finalize(); return 1;}/** 函數(shù)名: CountRank* 功能: 計(jì)算所屬部分?jǐn)?shù)據(jù)的秩* 輸入: data:指向待排序序列的指針* DataSize為待排序序列的長(zhǎng)度MyLength為該處理器要排序的序列的長(zhǎng)度rank:指向秩數(shù)組的指針SumID:總處理器個(gè)數(shù)MyID:處理器ID* 輸出:返回1代表程序正常結(jié)束*/int CountRank(int *data,int DataSize,int MyLength,int *rank,int SumID,int MyID){ int i, j; int start, end; start=DataSize/SumID*MyID; /*所屬部分?jǐn)?shù)據(jù)起始位置*/ end=start+MyLength; /*所屬部分?jǐn)?shù)據(jù)結(jié)束位置*/ for(j=start;j<end;j++){ /*計(jì)算所屬部分?jǐn)?shù)據(jù)的rank*/ rank[j-start]=0; for(i=0;i<DataSize;i++){ if((data[j]>data[i]) || ((data[j]==data[i]) && (j>i))) rank[j-start]++; } } return 1;}/** 函數(shù)名: ErrMsg* 功能: 讀入待排序序列的長(zhǎng)度* 輸入: 無(wú)* 輸出: 返回待排序序列的長(zhǎng)度*/int GetDataSize(){ int i; while(1){ printf("Input the Data Size :"); scanf("%d",&i); if((i>0) && (i<=65535)) break; ErrMsg("Wrong Data Size, must between [1..65535]"); } return i;}/** 函數(shù)名: ErrMsg* 功能: 輸出錯(cuò)誤信息* 輸入: msg:出錯(cuò)信息字符串* 輸出:返回1代表程序正常結(jié)束*/int ErrMsg(char *msg){ printf("Error: %s \n",msg); return 1;}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -