gpt4 book ai didi

c - MPI:取消非阻塞发送

转载 作者:太空宇宙 更新时间:2023-11-04 00:22:42 25 4
gpt4 key购买 nike

我正在使用 Open MPI 库来实现以下算法:我们有两个进程 p1p2 .他们都在执行一些迭代,并在每次迭代结束时交流他们的结果。问题是执行不一定是平衡的,所以p1可能在 p2 时间内执行 10 次迭代执行 1。尽管如此,我想要 p2读取 p1 执行的最后一次迭代的最新结果.

因此,我的想法是p1在每次迭代时发送其结果。但是,在发送迭代结果之前 i ,它应该检查是否 p2实际上从迭代中读取信息 i-1 .如果没有,它应该取消之前的发送,这样当p2p1 读取, 它将读取最近的结果。

不幸的是,我不确定该怎么做。我试过使用 MPI_Cancel,如以下代码所示:

int main (int argc, char *argv[]){

int myrank, numprocs;
MPI_Status status;
MPI_Request request;

MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

if(myrank == 0){
int send_buf = 1, flag;
MPI_Isend(&send_buf, 1, MPI_INT, 1, 123, MPI_COMM_WORLD,
&request);
MPI_Cancel(&request);
MPI_Wait(&request, &status);
MPI_Test_cancelled(&status, &flag);
if (flag) printf("Send cancelled\n");
else printf("Send NOT cancelled\n");
send_buf = 2;
MPI_Isend(&send_buf, 1, MPI_INT, 1, 123, MPI_COMM_WORLD,
&request);
}
else {
sleep(5);
int msg;
MPI_Recv(&msg, 1, MPI_INT, 0, 123,
MPI_COMM_WORLD, &status);
printf("%d\n", msg);
}
MPI_Finalize();

return 0;
}

但是当我执行时,它说无法取消发送并且p2打印 1 而不是 2。

我想知道是否有任何方法可以实现我的提议,或者是否有其他方法可以对 p1 之间的行为进行编码。和 p2 .

最佳答案

我会撤销通信控制。 p1 不会发送它必须取消的不必要的消息,p2 应该发出它已准备好接收消息的信号,而 p1 只会发送然后。与此同时,p1 只是用最新的结果覆盖它的发送缓冲区。

在(未经测试的)代码中:

if ( rank == 0 )
{
int ready;
MPI_Request p2_request;
MPI_Status p2_status;
// initial request
MPI_Irecv(&ready, 1, MPI_INT, 1, 123, MPI_COMM_WORLD, &p2_request);
for (int i=0; true; i++)
{
sleep(1);
MPI_Test(&p2_request, &ready, &p2_status);
if ( ready )
{
// blocking send: p2 is ready to receive
MPI_Send(&i, 1, MPI_INT, 1, 123, MPI_COMM_WORLD);
// post new request
MPI_Irecv(&ready, 1, MPI_INT, 1, 123, MPI_COMM_WORLD, &p2_request);
}
}
}
else
{
int msg;
MPI_Status status;
while (true)
{
sleep(5);
// actual message content doesn't matter, just let p1 know we're ready
MPI_Send(&msg, 1, MPI_INT, 0, 123, MPI_COMM_WORLD);
// receive message
MPI_Recv(&msg, 1, MPI_INT, 0, 123, MPI_COMM_WORLD, &status);
}
}

就像我说的,那是未经测试的代码,但您可能会明白我的意思。 MPI_Cancel 只应在出现严重错误时使用:在正常执行期间不应取消任何消息。

关于c - MPI:取消非阻塞发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4438901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com