我有一个使用 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 组 ...);然后首先在每个组内进行一次收集,然后再收集组
如果这些解决方案有效,有人可以帮助我吗?如果没有,有哪些可能的方法来提高性能?是这样,这两个怎么实现?非常感谢您的宝贵时间。