我正在尝试学习MPI编程,并编写了以下程序。它添加了整行数组并输出总和。在等级0(或进程0)处,它将调用其所有从属等级进行计算。我只想使用其他两个从属等级/进程来执行此操作。每当我尝试两次调用相同的等级(如下面的代码所示)时,我的代码就会挂在中间而无法执行。如果我不两次调用相同的等级,代码将正常工作
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
MPI_Init(&argc, &argv);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int tag2 = 1;
int arr[30] = {0};
MPI_Request request;
MPI_Status status;
printf ("\n--Current Rank: %d\n", world_rank);
int index;
int source = 0;
int dest;
if (world_rank == 0)
{
int i;
printf("* Rank 0 excecuting\n");
index = 0;
dest = 1;
for ( i = 0; i < 30; i++ )
{
arr[ i ] = i + 1;
}
MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
index = 0;
dest = 2;
for ( i = 0; i < 30; i++ )
{
arr[ i ] = 0;
}
MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
index = 0;
dest = 2; //Problem happens here when I try to call the same destination(or rank 2) twice
//If I change this dest value to 3 and run using: mpirun -np 4 test, this code will work correctly
for ( i = 0; i < 30; i++ )
{
arr[ i ] = 1;
}
MPI_Send(&arr[0], 30, MPI_INT, dest, tag2, MPI_COMM_WORLD);
}
else
{
int sum = 0;
int i;
MPI_Irecv(&arr[0], 30, MPI_INT, source, tag2, MPI_COMM_WORLD, &request);
MPI_Wait (&request, &status);
for(i = 0; i<30; i++)
{
sum = arr[i]+sum;
}
printf("\nSum is: %d at rank: %d\n", sum, world_rank);
}
MPI_Finalize();
}
使用时的结果:mpirun -np 3测试
--Current Rank: 2
Sum is: 0 at rank: 2
--Current Rank: 0
* Rank 0 excecuting
--Current Rank: 1
Sum is: 524800 at rank: 1
//Program hangs here and wouldn't show sum of 30
请让我知道我怎么能两次叫相同的等级。例如,如果我只有两个可以调用的从属进程。如果可能,请举例说明
在MPI中,每个进程执行相同的代码,并且在执行操作时,主要通过检查if / else语句中的等级来区分不同的进程。等级为0的主进程正在执行3个发送:发送到进程1,然后是两个发送至进程2。从属进程每个仅执行一个接收,这意味着等级1接收其第一条消息,等级2接收其第一条消息。当您MPI_Send
在进程0上调用第三个消息时,此后没有,也没有任何从属等待接收消息,因为从属已完成执行else块。当主机等待发送最终消息时,程序被阻塞。
为了解决这个问题,您必须确保等级2的从属执行两次接收,方法是仅为该进程添加一个循环,或者仅对该进程重复(因此,使用if(world_rank == 2)
检查)代码块
sum = 0; //resetting sum
MPI_Irecv(&arr[0], 1024, MPI_INT, source, tag2, MPI_COMM_WORLD, &request);
MPI_Wait (&request, &status);
for(i = 0; i<1024; i++)
{
sum = arr[i]+sum;
}
printf("\nSum is: %d at rank: %d\n", sum, world_rank);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句