資源簡(jiǎn)介
枚舉排序是一種最簡(jiǎn)單的排序算法,該算法的具體思想是對(duì)每一個(gè)待排序的元素統(tǒng)計(jì)小于它的所有元素的個(gè)數(shù),從而得到該元素最終處于序列鐘的位置。對(duì)該算法的并行化是很簡(jiǎn)單的,假設(shè)對(duì)一個(gè)長(zhǎng)為n的輸入序列使用n個(gè)處理器進(jìn)行排序,只需使每個(gè)處理器負(fù)責(zé)完成對(duì)其中一個(gè)元素的定位,然后將所有的定位信息集中到主進(jìn)程鐘,由主進(jìn)程負(fù)責(zé)完成所有元素的最終排位。
代碼片段和文件信息
#include?
#include?
#include?
/*
??*?函數(shù)名:?main
??*?功能:???主函數(shù),實(shí)現(xiàn)枚舉排序
??*?輸入:argc為命令行參數(shù)個(gè)數(shù);
??*????????????argv為每個(gè)命令行參數(shù)組成的字符串?dāng)?shù)組
??*?輸出:返回1代表程序正常結(jié)束
*/
int?main(int?argcchar?*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 data_in[i]=((int)rand())%10000;??/*生成隨機(jī)數(shù),并輸出*/
printf(“%10d?“da
評(píng)論
共有 條評(píng)論