c - 如何在 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();
解决方案
假设numbeOfProcesses=4
和numberOfLines=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_start
将4
for rank 0
, 8
forrank 1
等...
也应该相应地修改while循环。
正如@Gilles在评论中指出的那样,这里我们明确假设文件中的行数。这会导致很多问题。
为了获得可扩展性和并行性能优势,最好使用MPI IO,它为并行文件操作提供了强大的功能。MPI IO就是为这种用例而开发的。
推荐阅读
- scala - 这段代码的含义是什么?
- xampp - xampp 在 null 上调用成员函数 connect()
- python - 尝试将 SmartContract 写入 Pancakeswap 路由器时出现 Web3.py “未知帐户”错误
- javascript - 防止用户在未填写所需信息的情况下按下一步并在向导表单中显示警告消息 html 和 javascript 有效
- plantuml - plantuml : 分组序列使演员出现
- reactjs - 在 React 中,为什么在某些情况下会渲染两次?
- python - 模块“matplotlib”在 Django 中没有属性“switch_backend”
- asp.net - github 中 EF plus 审计功能的工作示例
- scrapy - Scrapy:(400 Bad Request)HTTP状态码未处理或不允许
- kubernetes-service - Kubernetes ClusterIP 服务只能从端点存在的节点访问