我有一些代码可以解决所有的最短路径问题,每个处理器都有一个结果。我正在尝试编写此结果,它是输出文件的矩阵。因此,每个具有部分解决方案的进程都会将结果写入正确位置的输出文件。现在我正在尝试为此使用 fseek 但由于整数大小不同而有点卡住了。像 2 和 -199 将不得不占用更多空间。我该怎么做才能使处理器不会相互覆盖?写作也可能存在竞争条件。
我应该以另一种方式这样做还是有办法做到这一点?我正在考虑将所有结果发送到一个进程(等级 0)并让它创建数组并写入文件。
不要使用 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
干杯。
您可以让每个进程以某种格式写入输出,这些格式可以在最后一个进程完成后合并和清理。像 (x, y, z), (x, y, z)...其中 x 是行的索引,y 是列,z 是值。
这对于内存映射文件来说是一项很好的工作。它们依赖于系统,但它们在 POSIX 和 Windows 操作系统系列中都实现了,所以如果你使用现代操作系统,它们就可以工作。在 boost 中有一个可移植且 C++ 友好的实现(类 mapped_file_source、mapped_file_sink 和 mapped_file)。进程间输出是其用法的经典示例。
它们是二进制的,因此 Samer 在他的回答中所说的大部分内容也适用,唯一的区别是您使用指针算术而不是查找。