У меня проблема с печатью разреженной матрицы в программе на С++/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 печатает вывод. Есть ли у вас какие-либо идеи?
mpirun -np k
сk >= 2
? В этом случае, как вы думаете, выделение большего объема оперативной памяти виртуальной машине улучшит производительность вывода? В настоящее время я использую 4 ГБ на виртуальной машине из 16 ГБ, доступных на моем ноутбуке. Спасибо за помощь - person Pierpaolo Necchi   schedule 07.02.2015