将MPI结果写入文件

Writing MPI result to a file

本文关键字:文件 结果 MPI      更新时间:2023-10-16

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

我应该用另一种方式做这件事,还是有一种方法来完成这件事?我正在考虑将所有结果发送到一个进程(rank 0),并创建数组并写入文件。

不要使用ASCII输出;使用二进制,它在大小上有很好的定义。

所以如果你使用fstream和double:

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字节,这是你的列表(5个元素)大小的double(8)倍。使用fseek将非常容易。

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

1-你必须学习端序的概念(大端序,小端序)。2-你必须按比例记录你的工作以供重用(目的、大小、元素数量、维度)。当我忘记记录东西时,我面临着巨大的误解(我是一个编程模拟的博士物理学家)。

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

幸运的是,有一个完整的库专门为你组织的东西,称为HDF5。它为您组织端序性和可移植性;然而,这并不容易处理,它有一个陡峭的学习曲线。

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

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

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

欢呼。

可以让每个进程以某种格式编写输出,这种格式可以在最后一个进程完成后合并和清理。比如(x, y, z), (x, y, z)……其中x为行索引,y为列,z为值。

这对于内存映射文件来说是一项很好的工作。它们是系统相关的,但它们在POSIX和Windows操作系统家族中都实现了,所以如果你使用现代的操作系统,它们也可以工作。在boost中有一个可移植的、c++友好的实现(类mapped_file_source、mapped_file_sink和mapped_file)。进程间输出是它们使用的一个经典例子。

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