将MPI结果写入文件

时间:2013-04-06 20:50:36

标签: c++ mpi

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

我应该采取另一种方式,还是有办法实现这一目标?我想将所有结果发送到一个进程(等级0)并创建数组并写入文件。

3 个答案:

答案 0 :(得分:1)

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

在科学环境中,当输出量很大时,建议使用二进制数据。但是:

1-你必须了解endianness的概念(big endian,little endian)。 2-您必须以适当的方式记录您的工作(目的,大小,元素数量,维度)。当我忘记记录内容时,我会面临巨大的误解(我是一名编程模拟的博士物理学家)。

因此,用于数据分析的ASCII不是正确的选择。

幸运的是,有一个专门为你组织东西的完整图书馆,名为HDF5。它为您组织字节顺序和便携性;然而,处理它并不容易,而且学习曲线陡峭。我认为这是以后的难题。

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

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

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

干杯。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

它们是二进制的,所以Samer大多数人在他的回答中也说,唯一的区别是你使用指针算术而不是寻求。