第三题

//*ʹÓÃMPI_Sendrecv(),MPI_Send(),MPI_Recv()ʵÏÖMPI_Alltoall*//
#include "mpi.h"
#include "stdio.h"

#define  maxlen 200
#define  dataCountPer 3//每次发送数据的个数(eg:进程0向进程1发送3个数据a[3],a[4],a[5])
//ALLtoAll º¯Êý
int  My_Alltoall(int  *sendBuffer,int sendcnt,MPI_Datatype sendtype,
			int *receiveBuffer,int recvcnt,MPI_Datatype recvtype,MPI_Comm comm,int rank,int size)
{
  	int i;
  	int j;
  	MPI_Status status;

  	if(size!=sendcnt||sendtype!=recvtype)
      		return 0;
  	for(i=0;i<size;i++)
  	{
	/*MPI_Sendrecv和MPI_Send,MPI_Recv混用
     		if(rank==i)
    		{
      			MPI_Sendrecv(&sendBuffer[i],1,sendtype,i,99,&receiveBuffer[i],1,recvtype,i,99,comm,&status);
    		}
     		else
    		{
      		 	MPI_Send(&sendBuffer[i],1,sendtype,i,i,comm);
      		 	MPI_Recv(&receiveBuffer[i],1,recvtype,i,rank,comm,&status); 
     		}
	*/
   
	/*只用MPI_Send和MPI_Recv
       		MPI_Send(&sendBuffer[i],1,sendtype,i,i,comm);
       		MPI_Recv(&receiveBuffer[i],1,recvtype,i,rank,comm,&status); 
	*/

	//只用MPI_Sendrecv
     		//MPI_Sendrecv(&sendBuffer[i*dataCountPer],1,sendtype,i,i,&receiveBuffer[i*dataCountPer],1,recvtype,i,rank,comm,&status);
		MPI_Sendrecv(&sendBuffer[i],1,sendtype,i,i,&receiveBuffer[i],1,recvtype,i,rank,comm,&status);
 	}
	return 1;  
}

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

   	int sendBuffer[maxlen],receiveBuffer[maxlen];
   	int i,j;
   	int count;
  
   	MPI_Init(&argc,&argv);
   	MPI_Comm_rank(MPI_COMM_WORLD,&rank);
   	MPI_Comm_size(MPI_COMM_WORLD,&size);
	//ÅжϜø³ÌÊýÊÇ·ñºÏ·š
    	if( size < 1 || size > 10 )   
     	{ 
		if( rank == 0 ) printf("Please input a  number between 1-10\n");
       		MPI_Finalize();
       		return 0;
      	}
   	count=size;

   	for(i=0;i<maxlen;i++)
   	{
       		sendBuffer[i]=10*rank+i; //³õÊŒ»¯·¢ËÍ»º³åÇø
       		receiveBuffer[i]=0;					 //³õÊŒ»¯œÓÊÕ»º³åÇø
   	}
	//测试初始化数据
	sleep(rank);
     	printf("进程%d初始化数据:",rank);
	//for(i=0;i<count*dataCountPer;i++)
	for(i=0;i<count;i++)
     	{
       		printf("%4d\t",sendBuffer[i]);
     	}
     	printf("\n");
/*//用于一次发送多个数据
//使用vector,注意:函数里面发送接收的个数是1个vec
MPI_Datatype vec;
MPI_Type_vector(1,dataCountPer,1,MPI_INT,&vec);
MPI_Type_commit(&vec);

   	My_Alltoall(sendBuffer,count,vec,receiveBuffer,count,vec,MPI_COMM_WORLD,rank,size);
 */

	 My_Alltoall(sendBuffer,count,MPI_INT,receiveBuffer,count,MPI_INT,MPI_COMM_WORLD,rank,size); 
	//测试输出
	sleep(rank+size);
     	printf("进程%d:",rank);
     	//for(i=0;i<count*dataCountPer;i++)
	for(i=0;i<count;i++)
     	{
       		printf("%4d\t",receiveBuffer[i]);
     	}
     	printf("\n");
 
	
   	MPI_Finalize();
   	return (0);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值