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

📄 bianma.c

📁 基于MPI 的网络并行计算环境下的 离散余弦变换并行程序
💻 C
字号:
#include "mpi.h"
#include "math.h"
#include "stdio.h"

#define  M 32
#define  N 128

int main( int argc, char *argv[])
{
    double starttime, endtime;
	double arr[M][N],p[8][8],q[8][8],c[8][8],a[8][8];
	double  ans1[8][8],DCT[M][N],a1[M][N],ans[M][N];
	int myid ,master,numprocs,len;
	int i,j,m,n,k,e,f,i1,j1,x,y;
	int numsent;
	char processor_name[MPI_MAX_PROCESSOR_NAME];
	MPI_Datatype anewtype;

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
    MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
	MPI_Get_processor_name(processor_name,&len);


	printf("processor %d  on%s\n",myid,processor_name);

	//由进程0读取image1.dat,xishu1.dat,xishu2.dat中的数据,并将其分别存入arr,q,p数组中。
	if (myid==0)
	{
		starttime=MPI_Wtime();
		FILE *fp; 
		FILE *fp1;
        FILE *fp2;
		if((fp=fopen("image1.dat","rb"))==NULL) //文件名是image1.dat 
			printf("Read error!!"); 
		
		for(i=0;i<M;i++) 
		{
			for(j=0;j<N;j++)
			{
				arr[i][j] = 0 ; //初始化数组		
			}
		}
		
		for(i=0;i<M;i++) 
		{
			for(j=0;j<N;j++)
			{
				fread(&arr[i][j],8,1,fp); //读取数据		
			}
		}
		fclose(fp);
		for(i=0;i<M;i++) 
		{ 
			for(j=0;j<N;j++) 
				printf("arr %f \t",arr[i][j]); 
		}
		
	
		
		if((fp1=fopen("xishu2.dat","rb"))==NULL) //文件名是xishu2.dat 
			printf("Read error!!"); 
		for(i=0;i<8;i++) 
		{
			for(j=0;j<8;j++)
			{
				p[i][j]=0; //初始化数组		
			}
		}
		for(i=0;i<8;i++) 
		{
			for(j=0;j<8;j++)
			{
				fread(&p[i][j],8,1,fp1); //读取数据		
			}
		}
		fclose(fp1);
		
		puts("The arrange is");    //打印该数组
		for(i=0;i<8;i++) 
		{ 
			for(j=0;j<8;j++) 
				printf("p %f \t",p[i][j]); 
		}
		
		if((fp2=fopen("xishu1.dat","rb"))==NULL) //文件名是xishu1.dat 
			printf("Read error!!"); 
		for(i=0;i<8;i++) 
		{
			for(j=0;j<8;j++)
			{
				q[i][j]=0; //初始化数组		
			}
		}
		for(i=0;i<8;i++) 
		{
			for(j=0;j<8;j++)
			{
				fread(&q[i][j],8,1,fp2); //读取数据		
			}
		}
		fclose(fp2);

		puts("The arrange is");   //打印该数组
		for(i=0;i<8;i++) 
		{ 
			for(j=0;j<8;j++) 
				printf("q %f \t",q[i][j]); 
		}
		
	}





	
	

master=0;
numsent=M/numprocs;

if (numsent*numprocs<M) numsent=numsent+1;
// 定义a的行向量类型anewtype并提交
MPI_Type_vector(N,1,1,MPI_DOUBLE,&anewtype);
MPI_Type_commit(&anewtype);

//广播矩阵p,q
MPI_Bcast(p,64,MPI_DOUBLE,master,MPI_COMM_WORLD);
MPI_Bcast(q,64,MPI_DOUBLE,master,MPI_COMM_WORLD);
//分发矩阵ayy
MPI_Scatter(arr,numsent,anewtype,a1,numsent,anewtype,master,MPI_COMM_WORLD);
//把矩阵的每个行块划分成8*8;对每块进行矩阵乘法
for(i=0;i<M/numprocs;i++) 
{ 
	for(j=0;j<N;j++) 
		printf("a1 %f \t",a1[i][j]); 
}
for(i=0;i<8;i++) 
{ 
	for(j=0;j<8;j++) 
		a[i][j]=0;
}

	


 for(i=0;i<numsent/8;i++)
	{
	 for(j=0;j<N/8;j++){
                    e=-1;
			for(x=(i*8);x<i*8+8;x++){
		        e=e+1; f=0;
				for(y=j*8;y<j*8+8;y++)
			
				{	a[e][f]=a1[x][y];
					f=f+1;
				}

			}
				for(m=0;m<8;m++) 
				{ 
					for(n=0;n<8;n++) 
						printf("a %f \t",a[m][n]); 
				}
				
	
				Multiply(8,p,a,c);
				for(m=0;m<8;m++) 
				{ 
					for(n=0;n<8;n++) 
						printf("c %f \t",c[m][n]); 
				}
				
	
				Multiply(8,c,q,ans1);

				for(m=0;m<8;m++) 
				{ 
					for(n=0;n<8;n++) 
						printf("ans1 %f \t",ans1[m][n]); 
				}
				

				for (i1=0;i1<8;i1++)
					for(j1=0;j1<8;j1++)

					{ 
						ans[i*8+i1][j*8+j1]=ans1[i1][j1];
					}
					
	 }		
					
	
}
 for(m=0;m<numsent;m++) 
 { 
	 for(j=0;n<N;n++) 
		 printf("ans %f \t",ans[m][n]); 
 }
//收集计算结果
  MPI_Gather(ans,numsent,anewtype,DCT,numsent,anewtype,master,MPI_COMM_WORLD);
  if(myid==0){
	  endtime=MPI_Wtime();
	   printf("time = %f\n",endtime-starttime);
	  printf("  The results are an fllows: \n");
	  for(i=0;i<M;i++){
		  for(j=0;j<N;j++)
			  printf("DCT %f \t",DCT[i][j]);
		  printf("\n");
	  }
  }
  MPI_Finalize();
}

Multiply(int n,double *a,double *b ,double *c)
{   
	int i,j,k;
	for(i=0;i<n;i++)
		for (j=0;j<n;j++)
			for(k=0;k<n;k++)
				c[i*n+j]+=a[i*n+k]*b[k*n+j];
}



	

⌨️ 快捷键说明

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