带发送和接收的MPI死锁

时间:2016-06-03 15:56:37

标签: c mpi

我的代码是输入数字a(较低范围)和b(较高范围),然后输入它们之间的数字c并找到此数字的位置范围

在ubuntu终端上运行此代码时,在输入数字a bc后它会停止运行,我尝试评论发送和恢复行并在发送之前打印位置声明及其工作

但我希望找到c的位置并将其发送给主进程进行打印

注意:我认为因为发送和接收是阻塞功能,这可能导致死锁或类似的东西?我不确定在这个问题上有任何帮助

#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"

int main(int argc , char * argv[])
{
int rank,nprocess,tag=0,a,b,c,i=0,*arr,*subArr,arrSize=0,blockSize=0,pos=0,dest;
MPI_Status status;
/* Start up MPI */
MPI_Init( &argc , &argv );

/* Find out process rank */
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

/* Find out number of process */
MPI_Comm_size(MPI_COMM_WORLD, &nprocess);

if(rank==0){
    printf("Enter the lower Range and the upper Range : ");
    if(scanf("%d",&a)){};  //2
    if (scanf("%d",&b)){}; //9
    printf("Enter the search number : ");
    if(scanf("%d",&c)){}; //5

    arrSize=(b-a)+1;
    while(arrSize%nprocess!=0)arrSize++; //Enhance the array Size

    printf("array size is : %d \n",arrSize);

    arr=(int *)malloc(arrSize*sizeof(int));

    for(i=0;i<arrSize;i++){
        if(i<((b-a)+1))arr[i]=a+i;
        else { arr[i]=b;}
    }

    printf("Array is :");
    for(i=0;i<arrSize;i++){
        printf("%d ",arr[i]); //2 3 4 5 6 7 8 9 9
    }
    printf("\n");

    blockSize=arrSize/nprocess; //3

    for(i=0;i<nprocess;i++){
        dest=i;
        MPI_Recv (&pos,1,MPI_INT,dest,tag,MPI_COMM_WORLD,&status);
    }

    printf("The postion of the number %d in the range from %d to %d is : %d \n ",c,a,b,pos);

}

MPI_Bcast (&c,1,MPI_INT,0,MPI_COMM_WORLD);
MPI_Bcast (&blockSize,1,MPI_INT,0,MPI_COMM_WORLD);


subArr=(int *) malloc(blockSize*sizeof(int));


MPI_Scatter (arr,blockSize,MPI_INT,subArr,blockSize,MPI_INT,0,MPI_COMM_WORLD);


for(i=0;i<blockSize;i++){
    if(subArr[i]==c){
        pos=(blockSize+1)*rank;
        printf("The Postion is : %d ",pos); // postion is 4 since array is 2 3 4 5 6 7 8 9 9 and I search for 5
        MPI_Send (&pos,1,MPI_INT,0,tag,MPI_COMM_WORLD);
        break;
    }
}

MPI_Finalize();
return 0;

}

1 个答案:

答案 0 :(得分:0)

确实,这是一个僵局。根进程尝试从其他进程发送MPI_Recv()个消息,而其他进程在MPI_Bcast(&c,...)被阻止,期望进程0广播某些内容。

在调用MPI_Recv()MPI_Bcast()之后移动MPI_Scatter()怎么样?

最后,对流程MPI_Recv(.,.,.,source,.,.)的{​​{1}}的每次通话都必须与流程to上对MPI_Send(.,.,.,to,.,.)的相应调用相匹配。由于您在数组中只查找了一个数字,因此只需调用source。因此,进程0必须只调用MPI_Send(...,0,.)一次。由于任何进程都可以发送消息,因此宏MPI_Recv()必须使用MPI_ANY_SOURCE的整数。

以下代码已更正。它由source编译并由mpicc main.c -o main -Wall运行。

mpirun -np 3 main