MPI_发送和MPI_接收不匹配C
我试图在这里实现一个工作池。我应该将总共100个不同的数字发送到从属进程。然后,每个从进程将某些内容返回给主进程,主进程将另一个不同的编号发送给从进程。这将一直持续到所有100次迭代结束 我的程序陷入了一个无限循环,我想这是由于MPI_Send和MPI_Recv的映射不正确造成的。我不知道我做错了什么。我花了好几个小时研究这个问题,但没有结果。我是新的MPI和编程一般。代码如下:MPI_发送和MPI_接收不匹配C,c,mpi,C,Mpi,我试图在这里实现一个工作池。我应该将总共100个不同的数字发送到从属进程。然后,每个从进程将某些内容返回给主进程,主进程将另一个不同的编号发送给从进程。这将一直持续到所有100次迭代结束 我的程序陷入了一个无限循环,我想这是由于MPI_Send和MPI_Recv的映射不正确造成的。我不知道我做错了什么。我花了好几个小时研究这个问题,但没有结果。我是新的MPI和编程一般。代码如下: if(rank == 0) { int i,iteration = 0, a=0,inside=0,
if(rank == 0) {
int i,iteration = 0, a=0,inside=0,temp=0;
for(i = 1; i < slaves; i++) {
MPI_Send(&iteration,1,MPI_INT,i,0,MPI_COMM_WORLD);
MPI_Send(&a,1,MPI_INT,i,1,MPI_COMM_WORLD);
iteration++;
}
while(iteration < 100+slaves){
MPI_Recv(&temp,1,MPI_INT,MPI_ANY_SOURCE,0, MPI_COMM_WORLD, &status);
if(iteration < 100) {
MPI_Send(&iteration,1,MPI_INT,status.MPI_SOURCE,0,MPI_COMM_WORLD);
MPI_Send(&a,1,MPI_INT,status.MPI_SOURCE,1,MPI_COMM_WORLD);
}
iteration++;
inside = inside + temp;
}
}
else {
int iteration=0,count=0;
if(iteration < 100) {
MPI_Recv(&iteration,1,MPI_INT,0,0,MPI_COMM_WORLD,&status);
MPI_Recv(&count,1,MPI_INT,0,1,MPI_COMM_WORLD,&status);
MPI_Send(&count,1,MPI_INT,0,0,MPI_COMM_WORLD);
}
}
if(秩==0){
int i,迭代=0,a=0,内部=0,温度=0;
对于(i=1;i
您还需要在从属队列中循环。现在,您将iteration
和a
从主机发送到从机,将count
从从机发送回主机,然后主机尝试从while
循环中发送iteration
和a
,奴隶们高兴地离开了else
区块,继续他们的快乐之路。要么去掉主进程中的while
循环,这样它就不会发送从属进程永远不会接收的内容,要么在从属进程中添加一个循环,这样它们就可以正确地接收数据。MPI中最重要的一点是要理解,通常每个进程都执行相同的程序。这将使您的一位好友获得mpi\u排名,因为您需要它来区分每个流程必须完成的不同任务
要理解的另一个重要点是MPI中的阻塞/非阻塞通信是如何工作的。这里我们使用阻塞通信(MPI\u Send()
和MPI\u Recv()
)。这意味着进程将在函数调用时停止,如MPI\u Recv()
,并等待通信伙伴到达它的“对应方”(即MPI\u Send()
,以向我发送内容)
程序被卡住的事实很好地表明,没有相同数量的MPI\u Send()
和MPI\u Recv()
调用:某个进程仍在等待接收消息/能够发送消息
以你为例,我会尝试这样做:
while( iterations < 100 ){
// in general every process has to do something for 100 times,
// but we have to have to distinguish between master and slaves.
if( mpi_rank == 0 ){
// The master process...
for( int slave_rank = 1; slave_rank < mpi_size; slave_rank++ ){
// ... has to send, receive and send once again something to/from every(!) slave, ...
MPI_Send( [one int to slave_rank] );
MPI_Recv( [one int from slave_rank] );
MPI_Send( [another int to slave_rank] );
}
}
else{
//... while the slaves just have to receive, send and receive again from/to one process (the master)
MPI_Recv( [one int from master] );
MPI_Send( [one int to master] );
MPI_Recv( [another int from master] );
}
iterations++;
}
while(迭代次数<100次){
//一般来说,每个过程都要做100次,
//但我们必须区分主人和奴隶。
如果(mpi_秩==0){
//主进程。。。
用于(int slave_rank=1;slave_rank
您的任务听起来像是:Master将int发送给slave#1、#2、#3……,然后他接收来自#1、#2、#3……,然后他将另一int发送给#1、#2、#3。你可能会意识到你必须在所有的奴隶等级上循环三次
此解决方案不同(虽然结果相同),但更短:主节点将int发送到从属节点1,然后从从属节点1接收int,然后将另一int发送到从属节点1。然后,对从机#2、#3、#4……重复同样的操作。。。。这样,我们只需在所有从属列上循环一次。为什么for循环从1开始,而不是从0开始:for(i=1;i
?@AntoJurković,因为主列(rank=0)只应该向从属列发送数据(rank>0)。