第二题

#include "mpi.h"
#include "stdio.h"

//矩阵A是NxN的;  小矩阵A[00] 是MxM的
int m=4;
int n=32;//n必须是m的倍数(n=4*m)

//这个函数就是我们需要定义的新类型
void newType(int m,int n,MPI_Datatype* newdt)
{
	int blockLen[2],indices[2];
	MPI_Datatype vec,types[2];

 	MPI_Type_vector(m,m,n,MPI_INT,&vec);//定义小块A[mxm]
        MPI_Type_commit(&vec);

        //定义大块,下界是0,上界是4*(2*m*n+2*m)字节
        int stride=2*m*n+2*m;
        int count=2;
        types[0] = vec;
        types[1] = MPI_UB;
        blockLen[0] = 1;
        blockLen[1] = 1;
        indices[0] = 0;
        indices[1] = sizeof(MPI_INT)*stride;

        MPI_Type_struct(count,blockLen,indices,types,newdt);
        MPI_Type_commit(newdt);
}

int main(int argc,char *argv[])
{
	int rank,size;
   	int i,j;
	int A[n][n];

	MPI_Datatype newdt;
	MPI_Status status;
  
   	MPI_Init(&argc,&argv);
   	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
   	MPI_Comm_size(MPI_COMM_WORLD,&size);
	
	newType(m,n,&newdt);
	
	for(i=0;i<n;i++)
          	for(j=0;j<n;j++)
                  	A[i][j]=0;

	if(rank==0)
	{
		for(i=0;i<n;i++)
                	for(j=0;j<n;j++)
                        	A[i][j]=10*i+j;

		printf("初始化A矩阵为:\n");
		for(i=0;i<n;i++)
        	{
                	for(j=0;j<n;j++)
                	{
                        	printf("%4d",A[i][j]);
                	}
			printf("\n");
        	}

		for(i=1;i<size;i++)
		{
			MPI_Send(A,i,newdt,i,i,MPI_COMM_WORLD);//向进程i发送i块A[00],A[22],A[44].....
		}		
	}
	else
	{
    		MPI_Recv(A,rank,newdt,0,rank,MPI_COMM_WORLD,&status);

		sleep(rank);
                printf("进程%d里面矩阵变为:\n",rank);
                for(i=0;i<n;i++)
                {
                        for(j=0;j<n;j++)
                        {
                                printf("%4d",A[i][j]);
                        }
                        printf("\n");
                }

  	}

    	MPI_Finalize();
   	return (0);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值