2017-05-22 57 views
0

上下文: 在我的程序中,主進程正在爲從進程分配工作。一旦從屬過程完成工作,它就會要求主人做更多的工作。主人給奴隸分配更多的工作,程序繼續進行。MPI_Waitany()或MPI_Recv()與MPI_ANY_SOURCE?

我已經編寫了這樣的程序,主進程使用MPI_Recv和MPI_ANY_SOURCE來接收來自從節點的工作。

/* Allot some work to all the slaves (seed) */ 

while (istheremorework()) { 
      /* Master receives slaves work*/ 

      MPI_Status status;    
      MPI_Recv(recvbuf, width + 1, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); 
      int slave = status.MPI_SOURCE; 

      cout << "Master recieved data from slave " << slave << endl; 
      /* store the data */  
      /* Master sends new work to the slave */ 
      int* sendbuf; 
      /* populate sendbuf */ 
      MPI_Send(&sendbuf, 2, MPI_INT, slave, MSG_TAG_DATA, MPI_COMM_WORLD); 
      /* update remaining work information */; 
} 

的這部分代碼也可以改寫爲

/* Allot some work to all the slaves (seed) */ 

/* Open a channel with all the slaves to receive their work. */ 
for (int k = 1; k < i; k++) { 
    MPI_Irecv(&recbuf[k], BUFFER_LENGTH, MPI_DOUBLE, k, MSG_TAG, MPI_COMM_WORLD, &requests[k - 1]); 
    /* Each slave sends the results to master */ 
} 

while (istheremorework()) { 
      /* Master receives slaves work*/   

      MPI_Waitany(np-1, requests, &index, statuses); 
      /* Using index to decide which slave sent the result */ 

      cout << "Master received data from slave " << slave << endl; 
      /* store the data */  
      /* Master sends new work to the slave */ 
      int* sendbuf; 
      /* populate sendbuf */ 
      MPI_Send(&sendbuf, 2, MPI_INT, slave, MSG_TAG_DATA, MPI_COMM_WORLD); 
      /* update remaining work information */; 
} 

是這兩種方法相互等同在性能方面?你是否看到使用其中一個的重大優勢?

+0

在第二個版本中,定義了'MPI_Waitany'中的'request'?好像你在'MPI_Waitany'之前有'Irecv',但你沒有顯示。 – Shibli

+0

@Shibli:是的。你是對的。在第二個版本中,「Irecv」在那裏。在最初向奴隸分配工作之後,使用'Irecv'打開一個通道,讓所有奴隸接受他們的工作,並使用'MPI_Waitany'一個接一個地消費。如果我的理解不正確,請糾正我。 –

回答

2

在Waitany版本中,您必須爲主進程上的每個工作者初始化並維護一個MPI_Request請求對象,並且MPI必須在調用MPI_Waitany()時遍歷所有這些對象。使用MPI_Recv(MPI_ANY_SOURCE),您只需處理消息隊列中的下一條消息。我懷疑MPI_Recv版本會更好。

您可以嘗試性能分析器來確保。對於中小型企業而言,在這種情況下可能不會有很大的性能差異。然而,在大規模的情況下,同時分配許多請求對象被認爲是一個壞主意。