第四题

<pre name="code" class="cpp">#include "mpi.h"
#include "stdio.h"

#define N 4
#define steps 3

/*************************************************************************************
*此函数实现:进程0里面A[i]++;A[0]=A[0]+B[0];     进程1里面实现:B[i]++;B[0]=A[0]+B[0];
*并实现了计算与通信重叠
*************************************************************************************/
void Send_Recv_Init(int myid)
{
	int i,j;
	int P[N];
	int buf;
	int dest=(myid+1)%2;
	int tag=99;
	
	MPI_Request req[2];
	MPI_Status status[2];
	
	//初始化
	for(i=0;i<N;i++)
		P[i]=myid+1;
	printf("进程%d里面初始化数组为:  ",myid);
	for(j=0;j<N;j++)
		printf("%3d",P[j]);
	printf("\n");

	MPI_Send_init(&P,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[0]);
	MPI_Recv_init(&buf,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[1]);

	for(i=0;i < steps;i++)//重复steps次
	{
		//先计算需要通信的部分P[0]
		P[0]++;
		//启动两个非阻塞通信
		MPI_Startall(2,req);
		//完成非阻塞通信,非阻塞通信对象变为非活动态
                MPI_Waitall(2,req,status);

		//计算剩余的部分
		for(j=1;j<N;j++)
			P[j]++;
		if(myid==0)		P[0] += buf;
		else if (myid==1)	P[0] *= buf;
		//测试输出
		sleep(i+myid);	
		printf("进程%d里面i=%d时数组结果为:  ",myid,i);
		printf("(buf为:%4d )",buf);
	        for(j=0;j<N;j++)
        	        printf("%4d",P[j]);
		printf("\n");
	}
	MPI_Request_free(req);
}

int main(int argc,char *argv[])
{
	int rank,size;

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size);
	
	Send_Recv_Init(rank);

	MPI_Finalize();
	return 0;
} 

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

#define N 4
#define steps 3

/*************************************************************************************
*此函数实现:进程0里面A[i]++;A[0]=A[0]+B[0];     进程1里面实现:B[i]++;B[0]=A[0]+B[0];
*并实现了计算与通信重叠
*************************************************************************************/
void Send_Recv_Init(int myid)
{
	int i,j;
	int P[N];
	int buf;
	int dest=(myid+1)%2;
	int tag=99;
	
	MPI_Request req[2];
	MPI_Status status[2];
	
	//初始化
	for(i=0;i<N;i++)
		P[i]=myid+1;
	printf("进程%d里面初始化数组为:  ",myid);
	for(j=0;j<N;j++)
		printf("%3d",P[j]);
	printf("\n");

	MPI_Send_init(&P,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[0]);
	MPI_Recv_init(&buf,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&req[1]);

	for(i=0;i < steps;i++)//重复steps次
	{
		//先计算需要通信的部分P[0]
		P[0]++;
		//启动两个非阻塞通信
		MPI_Startall(2,req);
		//完成非阻塞通信,非阻塞通信对象变为非活动态
                MPI_Waitall(2,req,status);

		//计算剩余的部分
		for(j=1;j<N;j++)
			P[j]++;
		if(myid==0)		P[0] += buf;
		else if (myid==1)	P[0] *= buf;
		//测试输出
		sleep(i+myid);	
		printf("进程%d里面i=%d时数组结果为:  ",myid,i);
		printf("(buf为:%4d )",buf);
	        for(j=0;j<N;j++)
        	        printf("%4d",P[j]);
		printf("\n");
	}
	MPI_Request_free(req);
}

int main(int argc,char *argv[])
{
	int rank,size;

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
	MPI_Comm_size(MPI_COMM_WORLD,&size);
	
	Send_Recv_Init(rank);

	MPI_Finalize();
	return 0;
} 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值