MPI: время вывода увеличивается с увеличением количества процессоров

У меня проблема с печатью разреженной матрицы в программе на С++/mpi, и я надеюсь, что вы поможете мне решить ее.

Проблема: мне нужно напечатать разреженную матрицу в виде списка 3-х элементов (x, y, v_xy) в файле .txt в программе, которая была распараллелена с MPI. Поскольку я новичок в MPI, я решил не иметь дело с инструкциями параллельного ввода-вывода, предоставляемыми библиотекой, и позволить главному процессору (в моем случае 0) распечатать вывод. Однако время печати матрицы увеличивается, когда я увеличиваю количество процессоров:

  • 1 процессор: 11,7 сек.
  • 2 процессора: 26,4 с
  • 4 процессора: 25,4 сек.

Я уже убедился, что результат одинаков во всех трех случаях. Вот соответствующий раздел кода:

if (rank == 0)
{    
    sw.start();

    std::ofstream ofs_output(output_file);
    targets.print(ofs_output);
    ofs_output.close();

    sw.stop();
    time_output = sw.get_duration();
    std::cout << time_output << std::endl;
}

Мой секундомер измеряет время настенных часов, используя функцию gettimeofday. Метод print для матрицы целей следующий:

void sparse_matrix::print(std::ofstream &ofs)
{
    int temp_row;
    for (const_iterator iter_row = _matrix.begin(); iter_row != _matrix.end(); ++iter_row)
    {
        temp_row = (*iter_row).get_key();
        for (value_type::const_iterator iter_col = (*iter_row).get_value().begin();
        iter_col != (*iter_row).get_value().end(); ++iter_col)
        {
            ofs << temp_row << "," << (*iter_col).get_key() << "," << (*iter_col).get_value() << std::endl;
        }
    }
}

Я не понимаю, в чем причина замедления, так как только процессор 0 выполняет вывод, и это самая последняя операция программы: все остальные процессоры работают, пока процессор 0 печатает вывод. Есть ли у вас какие-либо идеи?


person Pierpaolo Necchi    schedule 07.02.2015    source источник
comment
Это на самом деле три разные машины или вы тестируете этот код, притворяясь, что у вас три процессора на одной?   -  person stefan    schedule 07.02.2015
comment
@stefan: я использую четырехъядерный процессор i7 (dell XPS 15). Я забыл упомянуть, что я выполняю код на виртуальной машине Oracle Linux, которой я выделил 4 процессора в настройках. Я не могу понять зависимость времени выполнения печати от количества процессоров, так как только процессор 0 выполняет команду печати.   -  person Pierpaolo Necchi    schedule 07.02.2015
comment
В вашей виртуальной машине переключение на более чем один процессор создаст дополнительную нагрузку, которая замедлит работу вашей системы. Таким образом, условия вашего опыта измерения не имеют значения! Кстати, gettimeofday() — не лучшая функция для измерения производительности (см. linux.die.net /man/2/gettimeofday под заголовком «Примечания»).   -  person Christophe    schedule 07.02.2015
comment
@Christophe: Спасибо за полезную ссылку. Я буду иметь ввиду. Что касается замедления, возникают ли накладные расходы только тогда, когда я выполняю свой код, используя mpirun -np k с k >= 2? В этом случае, как вы думаете, выделение большего объема оперативной памяти виртуальной машине улучшит производительность вывода? В настоящее время я использую 4 ГБ на виртуальной машине из 16 ГБ, доступных на моем ноутбуке. Спасибо за помощь   -  person Pierpaolo Necchi    schedule 07.02.2015
comment
@PierpaoloNecchi Да, потому что, когда k›=2, реальный процессор начинает совместно использоваться и используется большим количеством процессов. Таким образом, гораздо больше переключений контекста. Но потенциально также больше задержки для синхронизации процессов. Я не думаю, что распределение памяти поможет, хотя я не знаю конструкции вашего WM.   -  person Christophe    schedule 07.02.2015
comment
@Christophe: Спасибо за объяснение: я перепутал ядра и процессоры. Если я понял, мой компьютер имеет только один процессор с 4 ядрами. Итак, при запуске 4 процессов с mpi каждый процесс будет выполняться на одном из ядер. Следовательно, мне нужно платить накладные расходы за то, чтобы мой процессор управлял своими 4 ядрами. Следовательно, замедление при печати вывода. Это правильно? Тем не менее, замедление x2.5 кажется огромным...   -  person Pierpaolo Necchi    schedule 08.02.2015
comment
Да, это замедление выглядит ужасно. Когда вы используете больше ядер, каждое ядро ​​​​немного медленнее, но общая пропускная способность процессора выше. Проблема с виртуальными процессорами заключается в том, что каждая среда — это больше, чем просто поток, работающий на ядре. Вы пробовали запустить MPI без WM? Обычно MPI должен иметь возможность использовать собственные ядра без накладных расходов. Посмотрите также здесь: stackoverflow.com/questions/5797615/mpi-cores- или-процессоры   -  person Christophe    schedule 08.02.2015


Ответы (1)


Ну, наконец-то я понял, в чем причина проблемы. Запуск моей программы, распараллеленной на MPI, на виртуальной машине linux резко увеличил время печати большого объема данных в .txt файл при увеличении количества используемых ядер. Проблема вызвана виртуальной машиной, которая ведет себя некорректно при использовании MPI. Я протестировал ту же программу на физической 8-ядерной машине, и время печати вывода не увеличивается с количеством используемых ядер.

person Pierpaolo Necchi    schedule 11.02.2015