2014-02-25 112 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完成您的非阻塞呼叫,但是当您完成后,您需要担心清理所有额外操作。