我有一个使用Visual C ++和Boost MPI的多处理程序。每个过程都将其分解,最后,过程0收集所有结果并进行汇总。以下是代码摘录(poolsummary是使用Boost序列化的类)
if(rank == 0){
vector<poolsummary> ps_;
vector<poolsummary> ps2_;
gather(world, ps, ps_, 0);
gather(world, ps2, ps2_, 0);
for(int i = 1; i < size;i++){
ps_[0].updateFromPool(ps_[i]);
ps2_[0].updateFromPool(ps2_[i]);
}
ps_[0].Save_file(asp.SCENARIO_PATH);
ps2_[0].Save_file2(asp.SCENARIO_PATH);
vector<poolsummary>().swap(ps_);
vector<poolsummary>().swap(ps2_);
}else{
gather(world, ps, 0);
gather(world, ps2, 0);
}
程序仍然需要收集另外两个类(让我们将它们称为hist和rep)。
通常,我使用64个处理器运行该程序,并且该收集部分的尾巴很长。我认为有两种方法可以改善效果 1.使用非阻塞聚集 2.将进程分为8组(例如,进程0-7作为组1,进程8-15作为组2 ...);然后首先在每个组中进行聚会,然后进行组
有人可以帮助我解决这些解决方案吗?如果没有,有什么可能的方法来提高性能?是这样,如何实现这两个?非常感谢您的宝贵时间。