2013-01-21 74 views
1

我有一个有点问题与并行读取如何从与MPI的文本文件和读取整数C++

我有一个文本文件,它看起来像这样:

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 

和我“M试图在每个处理的时间来读取这些整数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 

每个进程。

+1

这里你会遇到问题,因为你的线条长度不一样;有8,9,10,11和12个字符的行。因此,简单地将文件大小除以处理器数量(或其他数据)并将其读入是不太可能的。您可以使用与此答案相同的方法(http://stackoverflow.com/a/12942718/463827)来划分文件,并在后处理步骤中根据需要执行任何负载平衡。但是一般来说,文本文件对于并行I/O来说并不好。 –

+0

我从另一个创建该文件,因为我需要它被格式化为这样(我正在读图中的节点的邻居),所以我可以修改它,但我不知道是什么样的文件使用,所以我可以正确读取它,我应该使它二进制?什么是在这种情况下使用的最佳文件类型? –

+1

我会:(一)创建它作为一个二进制文件; (b)对它进行预处理,在运行之前将其分割成正确数量的子文件(例如'split -lines = N top.txt',其中N是每个处理器的行数)并让每个处理器读取它自己的文件;或者,如果文件不是很大,(c)用一个处理器读取它,然后使用'MPI_Scatter()'或'MPI_Scatterv()'分发数据。我们可能可以一起拼凑一些能够在相关答案中使用MPI-IO的方法,但除非有其他一些令人信服的理由,否则我倾向于认为这会比它的价值更麻烦。 –

回答

2

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

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

我会建议更改文件格式,以便每个数字代表4个字节。这也允许你按照你所做的方式分割文件。

+0

这也是事实。 –