2014-02-25 50 views
0

目前我正在嘗試創建一個主從程序,其中主機等待來自從機的消息作出決定。但是,儘管使用了非阻塞MPI例程,但我遇到了一個錯誤。我需要使用一些阻塞例程嗎?主從無阻聽衆

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

int main(int argc, char** argv) 
{ 
    // Variable Declarations 
    int rank, size; 
    MPI_Request *requestList,requestNull; 
    MPI_Status status; 
    // Start MPI 
    MPI_Init(&argc, &argv); 
    MPI_Comm_size(MPI_COMM_WORLD, &size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

    if(rank == 0) 
    { 
    // Process Zero 
    int dataOut=13, pr; 
    float dataIn = -1; 
    requestList =(MPI_Request*)malloc((size-1)*sizeof(MPI_Request)); 

    while(1){ 
     dataIn = -1; 
     // We do NOT need to wait for the MPI_ Isend(s), it is the job of the receiver processes. 
     for(pr=1;pr<size;pr++) 
     { 
     MPI_Irecv(&dataIn,1,MPI_FLOAT,pr,1,MPI_COMM_WORLD,&(requestList[pr-1])); 
     } 
     if((dataIn > 1.5)){ 
     printf("From the process: %f\n", dataIn); 
     break; 
     } 
    } 
    } 
    else 
    { 
    // Receiver Process 
    float message; 
    int index; 
    //MPI_Request request; 
    MPI_Status status; 

    while(1){ 
     message = random()/(double)1147483648; 
     // Send the message back to the process zero 
     MPI_Isend(&message,1,MPI_FLOAT,0,1,MPI_COMM_WORLD, &requestNull); 

     if(message > 1.5) 
     break; 
    } 
    } 
    MPI_Finalize(); 
    return 0; 
} 

回答

0

問題似乎是,您永遠不會等待您的MPI調用完成。

非阻塞呼叫在MPI中的工作方式是當您發出非阻塞呼叫(如MPI_IRECV)時,最後一個輸入參數是MPI_REQUEST對象。當初始化呼叫(MPI_IRECV)完成時,該請求對象包含非阻塞呼叫的信息。但是,該通話尚未完成,並且您不能保證通話完成,直到您請求完成通話(MPI_WAIT/MPI_TEST /和朋友)。

對於您的情況,您可能會不必要地使用非阻塞呼叫,因爲您依靠在下一行呼叫MPI_IRECV期間收到的信息。您可能應該用您的非阻塞呼叫代替阻止MPI_RECV呼叫並使用MPI_ANY_SOURCE,這樣您就不必爲通信器中的每個等級發佈單獨的接收呼叫。或者,您可以使用MPI_WAITANY完成您的非阻塞呼叫,但是當您完成後,您需要擔心清理所有額外操作。