Io 从文本文件读取MPI

Io 从文本文件读取MPI,io,parallel-processing,mpi,Io,Parallel Processing,Mpi,我正在学习MPI编程,我遇到了这个问题。假设我有一个包含100000行/行的.txt文件,如何将它们分块以供4个处理器处理?i、 e.我想让处理器0负责处理第0-25000行,处理器1负责处理第25000-50000行,依此类推。我做了一些搜索,发现了MPI_File_seek,但我不确定它是否能在.txt上工作,并在以后支持fscanf。文本对于并行处理来说不是一种很好的格式,因为您事先不知道(比如)第25001行的开始位置。因此,这类问题通常通过一些预处理步骤提前处理,要么构建索引,要么将文

我正在学习MPI编程,我遇到了这个问题。假设我有一个包含100000行/行的.txt文件,如何将它们分块以供4个处理器处理?i、 e.我想让处理器0负责处理第0-25000行,处理器1负责处理第25000-50000行,依此类推。我做了一些搜索,发现了MPI_File_seek,但我不确定它是否能在.txt上工作,并在以后支持fscanf。

文本对于并行处理来说不是一种很好的格式,因为您事先不知道(比如)第25001行的开始位置。因此,这类问题通常通过一些预处理步骤提前处理,要么构建索引,要么将文件划分为适当数量的块,以便每个进程读取

如果你真的想通过MPI来实现,我建议使用MPI-IO将文本文件的重叠块读入不同的处理器,其中的重叠比你预期的最长行要长得多,然后让每个处理器商定从哪里开始;例如,您可以说,进程N和N+1共享的重叠区域中的第一条(或最后一条)新线是进程N离开而N+1开始的地方

要继续使用一些代码

#包括
#包括
#包括
#包括
#包括
void parprocess(MPI_文件*in,MPI_文件*out,常量int秩,常量int大小,常量int重叠){
MPI_偏移量全局启动;
神秘化;
字符*块;
/*将文件的相关区块读入“区块”,
*从文件globalstart中的位置开始
*而且尺寸也很神秘
*/
{
MPI_偏移全局值;
MPI_偏移量文件大小;
/*找出谁在读什么*/
MPI文件大小(*in,&filesize);
文件大小--;/*删除文本文件eof*/
mysize=文件大小/大小;
globalstart=rank*mysize;
globalend=globalstart+mysize-1;
如果(rank==size-1)globalend=filesize-1;
/*将重叠添加到每个人块的末尾,最后一个过程除外*/
如果(等级!=尺寸-1)
globalend+=重叠;
mysize=globalend-globalstart+1;
/*分配内存*/
chunk=malloc((mysize+1)*sizeof(char));
/*每个人都读自己的部分*/
MPI文件在所有位置读取(*in,globalstart,chunk,mysize,MPI字符,MPI状态忽略);
chunk[mysize]='\0';
}
/*
*每个人都会计算他们的起点和终点
*从开始后的第一个换行到结束后的第一个换行
*重叠区域开始(例如,结束后-重叠+1)
*/
int locstart=0,locend=mysize-1;
如果(秩!=0){
while(chunk[locstart]!='\n')locstart++;
locstart++;
}
如果(等级!=尺寸-1){
locend-=重叠;
while(chunk[locend]!='\n')locend++;
}
mysize=locend-locstart+1;
/*通过将非空格字符替换为“1”来“处理”块
*排名1,‘2’代表排名2,等等。。。
*/

对于(int i=locstart;iThanks,@RobLatham。坦率地说,我想知道我是否应该删除这个答案——这是一个糟糕想法的低质量实现。不,请不要删除它。例如,生物信息学代码必须做到这一点。我希望这些代码生成索引输出,但如果它们不是,至少它们可以在pa中读取rallel.@RobLatham-好吧-也许我会重新编写一个更好的版本(另一个版本的索引形式很粗糙,只是为了演示一下。)
$ mpirun -n 3 ./textio foo.in foo.out
$ paste foo.in foo.out
Hi guys I am learning to            11 1111 1 11 11111111 11
program in MPI and I came           1111111 11 111 111 1 1111
across this question. Lets          111111 1111 111111111 1111
say I have a .txt file with         111 1 1111 1 1111 1111 1111
100,000 rows/lines, how do          1111111 11111111111 111 11
I chunk them for processing         1 11111 1111 111 1111111111
by 4 processors? i.e. I want        22 2 22222222222 2222 2 2222
to let processor 0 take care        22 222 222222222 2 2222 2222
of the processing for lines         22 222 2222222222 222 22222
0-25000, processor 1 to take        22222222 222222222 2 22 2222
care of 25001-50000 and so          2222 22 22222222222 222 22
on. I did some searching and        333 3 333 3333 333333333 333
did came across MPI_File_seek       333 3333 333333 3333333333333
but I am not sure can it work       333 3 33 333 3333 333 33 3333
on .txt and supports fscanf         33 3333 333 33333333 333333
afterwards.                         33333333333