gpt4 book ai didi

c - 动态检测两个处理器何时准备好在 MPI 中进行通信

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

我有一个 MPI 程序,其中每个处理器执行以下操作:

  • 做昂贵的操作。

  • 如果我需要远程存储任何东西(可以在任何其他处理器上),请在缓冲区中排队请求它并继续。

  • 如果缓冲区已满,则进入通信阶段。

在通信阶段,缓冲区满的处理器应该送走它的一些缓冲信息,然后返回“昂贵的操作”。当然,在至少有两个处理器进入通信阶段并可以执行 MPI 命令之前,这不会发生。

目前我正在通过暂停直到所有处理器进入通信阶段来处理这个问题,然后做类似的事情,

MPI_Allgather(Num_send_local,NTask,MPI_INT,Num_send_global,NTask,MPI_INT,MPI_COMM_WORLD);

其中 Num_send_local 是一个长度为 NTask 的数组,其中包含要发送给每个任务的事物的数量(因此 Num_send_global 就是 NTask*NTask)。

这行得通,但通常会导致大量资源浪费,因为可以相互通信的处理器会一直等待,直到每个人都准备好发送。

我真正想要的是在两个处理器进入通信阶段后立即进行通信,但我在实现它时遇到了麻烦。我尝试了以下方法:

//Tell everyone I'm in the comm phase now
for(i=0;i<NTask;i++)
{
if(Task==i)
continue;
MPI_Isend(&Num_send_local[i],1,MPI_INT,i,0,MPI_COMM_WORLD,&request[i]);
}
MPI_Recv(&local,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&status);
remote_partner = status.MPI_SOURCE;
//Do stuff between Task and remote_partner...

但这会遇到 remote_partner 收到其他人的发送请求而不是 Task 的问题。

我相信有更好的方法来做到这一点。有人有什么想法吗?

最佳答案

这完全取决于您的应用程序的规模,并且一如既往,衡量性能是关键(当您至少有一些工作版本时)。您可以尝试一种主从方法,其中一个进程负责将工作分配给空闲的从属进程。 Stackoverflow 和更大的互联网有很多关于实现主从并行程序的资源。

关于c - 动态检测两个处理器何时准备好在 MPI 中进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18762973/

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