【问题标题】:Writing MPI result to a file将 MPI 结果写入文件
【发布时间】:2013-04-08 19:59:30
【问题描述】:

我有一些代码可以解决所有的最短路径问题,每个处理器都有一个结果。我正在尝试编写此结果,它是输出文件的矩阵。因此,每个具有部分解决方案的进程都会将结果写入正确位置的输出文件。现在我正在尝试为此使用 fseek 但由于整数大小不同而有点卡住了。像 2 和 -199 将不得不占用更多空间。我该怎么做才能使处理器不会相互覆盖?写作也可能存在竞争条件。

我应该以其他方式执行此操作还是有办法完成此操作?我正在考虑将所有结果发送到一个进程(等级 0)并让它创建数组并写入文件。

【问题讨论】:

  • 将所有内容发送到零进程并不是一个糟糕的开始,但它显然存在可伸缩性问题,并且将您可以解决的问题大小限制为适合一个处理器内存的内容。一个长期的解决方案是查看MPI-IO,它会为您协调 MPI 输出。您可以使用 MPI-IO 写入文本文件(例如,this answer),但正如 Samer Afach 所解释的那样,我不推荐它,而且无论如何编写二进制文件更容易。

标签: c++ mpi


【解决方案1】:

不要使用 ASCII 输出;使用二进制,大小定义明确。

所以如果你使用 fstream 和双打:

fstream filewriter("file.bin",ios::out | ios::binary);

vector<double> mylist;
mylist.push_back(2.5);
mylist.push_back(7.6);
mylist.push_back(2.1);
mylist.push_back(3.2);
mylist.push_back(4.2);

filewriter.write((char*)&mylist[0],mylist.size()*sizeof(double));

这将准确写入 40 个字节,即双 (8) 倍的列表大小(5 个元素)。而且使用 fseek 会非常简单。

在具有大量输出的科学环境中,强烈建议使用二进制数据。然而:

1- 你必须了解字节序的概念(大字节序,小字节序)。 2- 您必须适当地记录您的工作以供重复使用(目的、大小、元素数量、维度)。当我忘记记录东西时,我会面临巨大的误解(我是一名物理学博士,负责编写模拟程序)。

所以 ASCII 用于数据分析并不是正确的选择。

幸运的是,有一个专门为您整理资料的完整库,称为 HDF5。它为您组织字节顺序和可移植性;但是,处理它并不容易,而且学习曲线陡峭。我认为这是一个更难的故事。

我建议您学习如何处理二进制文件以及如何阅读它们,了解它们的问题和问题。我认为你足够专业,可以处理二进制文件,因为你使用 MPI。

这是二进制文件的快速教程:

http://courses.cs.vt.edu/cs2604/fall02/binio.html

干杯。

【讨论】:

  • 这并没有解决他关于比赛条件的问题。
  • 它处理不同大小的整数。
  • +1 推荐二进制文件。 HDF5 具有挑战性的学习曲线,但非常强大。如果您要处理矩形数组(如矩阵),一个不错的选择是 NetCDF,它在后台使用 HDF5 进行并行 IO,但使用起来明显更简单。
【解决方案2】:

您可以让每个进程以某种格式写入输出,这些格式可以在最后一个完成后合并和清理。像 (x, y, z), (x, y, z)...其中 x 是行的索引,y 是列,z 是值。

【讨论】:

    【解决方案3】:

    这对于内存映射文件来说是一项很好的工作。它们依赖于系统,但它们在 POSIX 和 Windows 操作系统系列中都实现了,因此如果您使用现代操作系统,它们就可以工作。在 boost 中有一个可移植且 C++ 友好的实现(类 mapped_file_source、mapped_file_sink 和 mapped_file)。进程间输出是其用法的经典示例。

    它们是二进制的,因此 Samer 在他的回答中所说的大部分内容也适用,唯一的区别是您使用指针算术而不是查找。

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2014-06-15
      相关资源
      最近更新 更多