MPI:当处理器数量增加时输出时间增加
MPI: time for output increases when the number of processors increase
我在 c++/mpi 程序中打印稀疏矩阵时遇到问题,希望你能帮我解决。
问题: 我需要在程序的 .txt 文件中打印一个稀疏矩阵作为 3-ples (x, y, v_xy) 的列表已与 MPI 并行化。由于我是 MPI 的新手,所以我决定不处理库提供的并行 IO 指令,而是让主处理器(在我的例子中为 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 打印输出。你有什么想法吗?
好吧,我终于明白是什么导致了这个问题。 运行 我的程序在 MPI 上并行化,在 linux 虚拟机上,当增加使用的内核数量时,大大增加了在 .txt 文件中打印大量数据的时间。问题是由虚拟机引起的,它在使用 MPI 时行为不正确。我在一台物理 8 核机器上测试了相同的程序,打印输出的时间并没有随着使用的内核数量的增加而增加。
我在 c++/mpi 程序中打印稀疏矩阵时遇到问题,希望你能帮我解决。
问题: 我需要在程序的 .txt 文件中打印一个稀疏矩阵作为 3-ples (x, y, v_xy) 的列表已与 MPI 并行化。由于我是 MPI 的新手,所以我决定不处理库提供的并行 IO 指令,而是让主处理器(在我的例子中为 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 打印输出。你有什么想法吗?
好吧,我终于明白是什么导致了这个问题。 运行 我的程序在 MPI 上并行化,在 linux 虚拟机上,当增加使用的内核数量时,大大增加了在 .txt 文件中打印大量数据的时间。问题是由虚拟机引起的,它在使用 MPI 时行为不正确。我在一台物理 8 核机器上测试了相同的程序,打印输出的时间并没有随着使用的内核数量的增加而增加。