У меня есть многопроцессорная программа, использующая Visual C ++ и Boost MPI.Каждый процесс разбивает на части и, в конце концов, процесс 0 собирает все результаты и суммирует.Ниже приведена выдержка из кода (poolummary - это класс, использующий сериализацию 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 ...);Затем сначала соберите группу в каждой группе, а затем соберите группы
Может ли кто-нибудь помочь мне, если эти решения будут работать?Если нет, каковы возможные пути улучшения производительности?Это так, как реализовать эти два?Большое спасибо за ваше время.