gpt4 book ai didi

c++ - 在 for 循环中处理复杂的 send recv 消息

转载 作者:行者123 更新时间:2023-11-28 04:31:40 24 4
gpt4 key购买 nike

我正在尝试使用 boost::mpi 并行化 C++ 中的生物模型。这是我的第一次尝试,我是 boost 库的新手(我是从 Schaling 的 Boost C++ Libraries 一书开始的)。该模型由网格单元和生活在每个网格单元中的个体组成。这些类是嵌套的,因此 Cohorts* 的 vector 属于 GridCell。该模型运行了 1000 年,并且在每个时间步都有分散,使得个体队列在网格单元之间随机移动。我想并行化 for 循环的内容,而不是循环本身,因为每个时间步都取决于前一次的状态。

我使用 world.send()world.recv() 将必要的信息从一个级别发送到另一个级别。因为有时我使用 mpi::statusworld.iprobe() 来确保代码不会在等待消息时挂起从未发送过(我关注了 this tutorial )

我的代码的第一部分似乎工作正常,但在继续 for 循环中的下一步之前,我无法确保已收到所有发送的消息。事实上,我注意到一些等级在其他等级有时间发送他们的消息之前就进入了下一个时间步长(或者至少是输出的样子)

我没有发布代码,因为它由几个类组成,而且很长。如果有兴趣,代码在 github 上.我在这里大致写下伪代码。我希望这足以理解问题。

int main()
{
// initialise the GridCells and Cohorts living in them

//depending on the number of cores requested split the
//grid cells that are processed by each core evenly, and
//store the relevant grid cells in a vector of GridCell*

// start to loop through each time step
for (int k = 0; k < (burnIn+simTime); k++)
{
// calculate the survival and reproduction probabilities
// for each Cohort and the dispersal probability

// the dispersing Cohorts are sorted based on the rank of
// the destination and stored in multiple vector<Cohort*>

// I send the vector<Cohort*> with
world.send(…)

// the receiving rank gets the vector of Cohorts with:
mpi::status statuses[world.size()];
for(int st = 0; st < world.size(); st++)
{
....
if( world.iprobe(st, tagrec) )
statuses[st] = world.recv(st, tagrec, toreceive[st]);
//world.iprobe ensures that the code doesn't hang when there
// are no dispersers
}
// do some extra calculations here

//wait that all processes are received, and then the time step ends.
//This is the bit where I am stuck.
//I've seen examples with wait_all for the non-blocking isend/irecv,
// but I don't think it is applicable in my case.
//The problem is that I noticed that some ranks proceed to the next
//time step before all the other ranks have sent their messages.
}
}

我用

编译
mpic++ -I/$HOME/boost_1_61_0/boost/mpi -std=c++11  -Llibdir \-lboost_mpi -lboost_serialization -lboost_locale  -o out

并使用 mpirun -np 5 out 执行,但我希望稍后能够在 HPC 集群上使用更多的内核执行(该模型将在全局范围内运行,并且单元格的数量可能取决于用户选择的网格单元格大小)。安装的编译器是g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0, Open MPI: 2.1.1

最佳答案

您没有任何内容可发送这一事实在您的场景中是一条重要的信息。您不能仅从没有消息中推断出该事实。没有消息仅表示尚未未发送任何消息。

简单地发送一个零大小的 vector 并跳过探测是最简单的方法。

否则,您可能不得不彻底改变您的方法或实现非常复杂的推测执行/回滚机制。

另请注意,链接的教程以非常不同的方式使用探针。

关于c++ - 在 for 循环中处理复杂的 send recv 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52730583/

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