2016-06-03 10 views
1

meinen Code auf Zahlen a (unterer Bereich) und b (oberer Bereich), dann gibt Sie Zahl zwischen ihnen c und finden Sie die Position dieser Zahl im BereichMPI Deadlock mit Senden und Empfangen

wenn eingeben führen sie diesen Code auf ubuntu-Terminal, stoppen sie läuft nach Eingabe der Zahlen ab und c, ich versuche, den Send zu kommentieren und Linien wieder zu beleben und die Position drucken, bevor senden Aussage und seine Arbeit

, aber ich möchte die Position zu finden, c und senden Sie es an den Master-Prozess, um es zu drucken

Hinweis: Ich denke, weil senden und empfangen Blockierungsfunktionen sind, kann dies einen Deadlock oder etwas ähnliches verursachen? Ich bin nicht sicher, so schätzen jede mögliche Hilfe in diesem Problem

#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; 

}

Antwort

0

der Tat ist dies eine Sackgasse. Der Root-Prozess versucht MPI_Recv() Nachrichten von den anderen Prozessen, während die anderen Prozesse bei MPI_Bcast(&c,...) blockiert werden, der Prozess 0 erwartet, um etwas zu senden.

Wie wäre es mit dem Verschieben der MPI_Recv() nach Rufe an MPI_Bcast() und MPI_Scatter()?

Schließlich jeder Aufruf MPI_Recv(.,.,.,source,.,.) auf Prozess tosource einen Korrespondenz-Aufruf MPI_Send(.,.,.,to,.,.) auf Prozess müssen übereinstimmen. Da nur ein Vorkommen der Nummer vorhanden ist, nach der Sie im Array suchen, gibt es einen einzigen Aufruf an . Folglich muss Prozess 0 MPI_Recv() nur einmal aufrufen. Da jeder Prozess die Nachricht gesendet haben könnte, muss das Makro MPI_ANY_SOURCE intad source verwendet werden.

Der folgende Code wurde korrigiert. Es ist zu kompilieren von mpicc main.c -o main -Wall und lief von mpirun -np 3 main.

#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,deadlock=0; 
    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 : ");fflush(stdout); 
     if(scanf("%d",&a)){}; //2 
     if (scanf("%d",&b)){}; //9 
     printf("Enter the search number : ");fflush(stdout); 
     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 



    } 

    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)*rank+i; 
      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 
     if(rank==0){ 
      deadlock=1; 
      break; 
     } 
      MPI_Send (&pos,1,MPI_INT,0,tag,MPI_COMM_WORLD); 
      break; 
     } 
    } 

    if(rank==0){ 

     //for(i=0;i<nprocess;i++){ 
     //  dest=i; 
     if(deadlock==0) 
     MPI_Recv (&pos,1,MPI_INT,MPI_ANY_SOURCE,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); 
     free(arr); 
    } 
    free(subArr); 
    MPI_Finalize(); 
    return 0; 
} 
+0

vielen dank für ihre hilfe ... ich werde überprüfen sie ihre antwort als die besten .. bitte akzeptieren sie meine bearbeiten – Islams