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 */;
}
是這兩種方法相互等同在性能方面?你是否看到使用其中一個的重大優勢?
在第二個版本中,定義了'MPI_Waitany'中的'request'?好像你在'MPI_Waitany'之前有'Irecv',但你沒有顯示。 – Shibli
@Shibli:是的。你是對的。在第二個版本中,「Irecv」在那裏。在最初向奴隸分配工作之後,使用'Irecv'打開一個通道,讓所有奴隸接受他們的工作,並使用'MPI_Waitany'一個接一個地消費。如果我的理解不正確,請糾正我。 –