【问题标题】:How to read ints from a text file with MPI and C++如何使用 MPI 和 C++ 从文本文件中读取整数
【发布时间】:2013-01-22 06:53:10
【问题描述】:

并行阅读有点问题

我有一个如下所示的文本文件:

1 4 30 46 
0 2 3 29 
1 11 12 -1 
1 4 5 -1 
0 3 13 14 
3 6 7 8 
5 10 -1 -1 
13 10 -1 -1 
5 9 27 -1 

我试图在每个进程中一次读取 4 个整数,文件的行数等于进程数,每行包含 4 个整数

int bufsize, count; 
int *buf;
MPI::Status status; 

MPI::File top = MPI::File::Open(MPI::COMM_WORLD, "top.txt", MPI::MODE_RDONLY, MPI::INFO_NULL); 

MPI::Offset filesize = top.Get_size(); 
filesize = filesize / sizeof(int);
bufsize = filesize / wasteland_size + 1;

buf = new int[bufsize * sizeof(int)]; 

top.Set_view(my_rank * bufsize * sizeof(int), MPI_INT, MPI_INT, "native", MPI::INFO_NULL); 
top.Read(buf, bufsize, MPI_INT, status); 
count = status.Get_count(MPI_INT); 

top.Close();

这是我正在使用的代码。

它编译时没有错误或警告,但它会输出一些内容:

540287025 874524723 805969974 857748000 

对于每个进程。

【问题讨论】:

  • 你会在这里遇到问题,因为你的行长度不一样;有 8、9、10、11 和 12 个字符的行。因此,简单地将文件大小除以处理器(或其他东西)的数量并将其读入是不可能的。您可以使用相同的方法as in this answer 来划分文件,并在后处理步骤中根据需要进行任何负载平衡。但总的来说,文本文件并不适合并行 I/O。
  • 我正在从另一个文件创建该文件,因为我需要将其格式化为这样(我正在用它读取图中节点的邻居),以便我可以修改它,但我不知道要使用哪种文件,所以我可以正确读取它,我应该把它变成二进制文件吗?在这种情况下使用什么文件类型最好?
  • 我会:(a)将其创建为二进制文件; (b) 在运行之前对其进行预处理以将其拆分为正确数量的子文件(例如,split --lines=N top.txt,其中 N 是每个处理器的行数)并让每个处理器读取自己的文件;或者,如果文件不是很大,(c) 使用一个处理器将其读入,然后使用MPI_Scatter()MPI_Scatterv() 分发数据。我们可能会使用链接答案中的方法来拼凑一些可以使用 MPI-IO 的东西,但除非有其他令人信服的理由,否则我倾向于认为这会比它的价值更麻烦。
  • 感谢乔纳森的回答。我实际上考虑过拆分文件 int 子文件和 MPI_Scatter,但由于我只学习 MPI,我想看看 MPI-IO 是如何工作的。我会尝试使文件二进制。再次感谢您抽出宝贵时间回答我的 n00b 问题 :)

标签: c++ mpi


【解决方案1】:

问题是你的文件是一个文本文件,但它没有被解释为这样。您正在从二进制文件中读取整数。

当您将这些数字中的任何一个转换为十六进制时,您会看到它们由代表 ASCII 中的数字或空格的字节组成。

我建议更改文件格式,以便将每个数字表示为 4 个字节。这也允许您按照您所做的方式拆分文件。

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2011-12-28
    • 1970-01-01
    • 2017-05-25
    • 2023-04-09
    • 1970-01-01
    • 2018-10-25
    • 2014-04-21
    • 1970-01-01
    相关资源
    最近更新 更多