⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bubblesort.c

📁 Bubble Sorting using MPI libraries
💻 C
字号:
/* bubble sort */#include <stdio.h>#include <mpi.h>#include <time.h>#define N 1000000void showElapsed(int id, char *m);void showVector(int *v, int n, int id);int * merge(int *v1, int n1, int *v2, int n2);void swap(int *v, int i, int j);void sort(int *v, int n);double startT,stopT;double startTime;void showElapsed(int id, char *m){	printf("%d: %s %f secs\n",id,m,(clock()-startTime)/CLOCKS_PER_SEC);}void showVector(int *v, int n, int id){	int i;	printf("%d: ",id);	for(i=0;i<n;i++)		printf("%d ",v[i]);	putchar('\n');}int * merge(int *v1, int n1, int *v2, int n2){	int i,j,k;	int * result;	result = (int *)malloc((n1+n2)*sizeof(int));	/*		i : pointer of v1		j : pointer of v2		k : pointer of k	*/	i=0; j=0; k=0;	while(i<n1 && j<n2)		if(v1[i]<v2[j])		{			result[k] = v1[i];			i++; k++;		}		else		{			result[k] = v2[j];			j++; k++;		}	if(i==n1)		while(j<n2)		{			result[k] = v2[j];			j++; k++;		}	else		while(i<n1)		{			result[k] = v1[i];			i++; k++;		}	return result;}void swap(int *v, int i, int j){	int t;	t = v[i];	v[i] = v[j];	v[j] = t;}void sort(int *v, int n){	int i,j;	for(i=n-2;i>=0;i--)		for(j=0;j<=i;j++)			if(v[j]>v[j+1])				swap(v,j,j+1);}main(int argc, char **argv){	int * data;	int * chunk;	int * other;	int m,n=N;	int id,p;	int s;	int i;	int step;	MPI_Status status;	MPI_Init(&argc,&argv);	MPI_Comm_rank(MPI_COMM_WORLD,&id);	MPI_Comm_size(MPI_COMM_WORLD,&p);	if(id==0)	{		int r;		srandom(clock());		s = n/p;		r = n%p;		data = (int *)malloc((n+p-r)*sizeof(int));		for(i=0;i<n;i++)			data[i] = random();		if(r!=0)		{			for(i=n;i<n+p-r;i++)  			   data[i]=0;			s=s+1;		}		startT = clock();		MPI_Bcast(&s,1,MPI_INT,0,MPI_COMM_WORLD);		chunk = (int *)malloc(s*sizeof(int));		MPI_Scatter(data,s,MPI_INT,chunk,s,MPI_INT,0,MPI_COMM_WORLD);		sort(chunk,s);	}	else	{		MPI_Bcast(&s,1,MPI_INT,0,MPI_COMM_WORLD);		chunk = (int *)malloc(s*sizeof(int));		MPI_Scatter(data,s,MPI_INT,chunk,s,MPI_INT,0,MPI_COMM_WORLD);		sort(chunk,s);	}	step = 1;	while(step<p)	{		if(id%(2*step)==0)		{			if(id+step<p)			{				MPI_Recv(&m,1,MPI_INT,id+step,0,MPI_COMM_WORLD,&status);				other = (int *)malloc(m*sizeof(int));				MPI_Recv(other,m,MPI_INT,id+step,0,MPI_COMM_WORLD,&status);				chunk = merge(chunk,s,other,m);				s = s+m;			} 		}		else		{			int near = id-step;			MPI_Send(&s,1,MPI_INT,near,0,MPI_COMM_WORLD);			MPI_Send(chunk,s,MPI_INT,near,0,MPI_COMM_WORLD);			break;		}		step = step*2;	}	if(id==0)	{		FILE * fout;		stopT = clock();		printf("%d; %d processors; %f secs\n",N,p,(stopT-startT)/CLOCKS_PER_SEC);		fout = fopen("result","w");		for(i=0;i<s;i++)		   if (chunk[i] != 0)  			fprintf(fout,"%d\n",chunk[i]);		fclose(fout);	}	MPI_Finalize();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -