首页 > 解决方案 > 如何在 C 中使用 MPI 从不同进程中的文本文件中读取不同的行间隔

问题描述

我正在尝试将 100 万行浮点数分配给 16 个不同的进程。例如,进程 0 需要在 1-62500 行之间读取,进程 1 需要在 62501-125000 行之间读取,等等。

我试过下面的代码,但每个进程都会读取 1-62500 之间的行。如何更改每个进程的行间隔?

MPI_Init(NULL, NULL);

n=1000000/numberOfProcesses;

FILE *myFile;

myFile = fopen("input.txt","r");
i=0;
k = n+1;
while(k--){
    fscanf(myFile,"%f",&input[i]);
    i++;
}
fclose(myFile);

MPI_Finalize();

标签: cparallel-processingmpi

解决方案


假设numbeOfProcesses=4numberOfLines=16

//so new n will be 4
//n=1000000/numberOfProcesses;
n=numberOfLines/numbeOfProcesses
FILE *myFile;

myFile = fopen("input.txt","r");
i=0;
k = n+1 //(5)

从您的程序中,所有进程都将从相同的位置或偏移量读取文件。您需要做的是让每个进程从它们自己的特定行或偏移量中读取。例如,rank 0 应该读取 from 0,rank 1 from n,rank 2 from2*n等等。将此作为参数传递给 fseek。

n=numberOfLines/numbeOfProcesses
MPI_Comm_rank(MPI_COMM_WORLD,&rank)
file_start= n*rank
fseek(myfile, file_start, SEEK_SET);

fseek将转到文件的偏移量(file_start)。然后file_start4for rank 0, 8forrank 1等...

也应该相应地修改while循环。

正如@Gilles在评论中指出的那样,这里我们明确假设文件中的行数。这会导致很多问题。

为了获得可扩展性并行性能优势,最好使用MPI IO,它为并行文件操作提供了强大的功能。MPI IO就是为这种用例而开发的。


推荐阅读