MPI:输出时间随着处理器数量的增加而增加
MPI: time for output increases when the number of processors increase
我在c++/mpi程序中打印稀疏矩阵时遇到问题,希望您能帮我解决。
问题:我需要在一个使用MPI并行化的程序中,在.txt文件中打印一个稀疏矩阵,作为3个像素(x,y,v_xy)的列表。由于我是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打印输出。你知道吗?
好吧,我终于明白了问题的原因。在linux虚拟机上运行我的程序,在MPI上并行化,大大增加了在.txt文件中打印大量数据的时间,同时增加了使用的内核数量。该问题是由虚拟机引起的,该虚拟机在使用MPI时行为不正确。我在一台8核物理机器上测试了同样的程序,打印输出的时间不会随着使用的核数而增加。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 数组索引的值没有增加
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- 为什么我的代码在输出中增加了93天
- C/C++预处理器是否可以检测一些编译器选项
- 有效地使用std::unordered_map来插入或增加键的值
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 从预处理器获取 Windows 版本(C++ Win32)
- 如何摆脱为条件编译定义预处理器宏的需要?
- C 预处理器 - 现有定义的预置路径
- MPI:输出时间随着处理器数量的增加而增加
- openmpc++不能随着处理器数量的增加而线性加速