//*ʹÓÃ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);
}
第三题
最新推荐文章于 2022-03-13 14:15:00 发布