【发布时间】: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 问题 :)