OpenMPI 并行读取文本文件
OpenMPI parallelize reading a Text File
我希望使用此代码执行以下操作:
将文件读入缓冲区(效果很好!)(并且不想更改我读取文件的方式和存储方式)。
使用 MPI_Scatter
跨多个 "Nodes" 发送该缓冲区,因此每个节点都可以计算出现空白的次数 space。
我做的代码如下:
#include <stdio.h>
#include <mpi.h>
int main() {
int file_size = 10000;
FILE * fp;
int my_size, my_id, size, local_acum=0, acum=0, i;
char buf[file_size], recv_vect[file_size];
fp = fopen("pru.txt","r");
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
fread (buf,1,size,fp);
// Initialize the MPI environment
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &my_size);
MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
MPI_Scatter(buf, size / my_size, MPI_CHAR, recv_vect,
size / my_size, MPI_CHAR, 0, MPI_COMM_WORLD);
local_acum=0;
for (i=0; i < size / my_size; i++){
// printf("%c", buf[i]);
if (buf[i] == ' '){
local_acum++;
}
}
printf("\nlocal is %d \n", local_acum);
acum=0;
MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce(&local_acum, &acum, 1, MPI_INT, MPI_SUM,
0, MPI_COMM_WORLD);
if (my_id == 0){
printf("Counter is %d \n", acum);
}
// Finalize the MPI environment.
MPI_Finalize();
}
我没有得到想要的结果。
如果我 运行 使用选项 -np 1 它工作完美(正如预期的那样)。
然而,当我 运行 使用选项 -np 2 或更高时,我没有得到我的愿望
结果。
每个节点的行为是它总是计算相同数量的空白 spaces!我相信这是问题的关键。
如果在我的节点中
for (i=0; i < sie; i++)
这会计算空白 space 的数量。所以每个节点都有整个缓冲区。我不明白为什么因为在散点图中我告诉 pass (size / my_size)
- 您正在遍历
buf
,它包含整个文件,而不是 recv_vect
,它只包含每个等级的部分。
- 您正在每个节点上读取整个文件,而不仅仅是在根节点上。这对你的情况没有任何意义。
我希望使用此代码执行以下操作:
将文件读入缓冲区(效果很好!)(并且不想更改我读取文件的方式和存储方式)。
使用 MPI_Scatter
跨多个 "Nodes" 发送该缓冲区,因此每个节点都可以计算出现空白的次数 space。
我做的代码如下:
#include <stdio.h>
#include <mpi.h>
int main() {
int file_size = 10000;
FILE * fp;
int my_size, my_id, size, local_acum=0, acum=0, i;
char buf[file_size], recv_vect[file_size];
fp = fopen("pru.txt","r");
fseek(fp, 0L, SEEK_END);
size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
fread (buf,1,size,fp);
// Initialize the MPI environment
MPI_Init(NULL, NULL);
MPI_Comm_size(MPI_COMM_WORLD, &my_size);
MPI_Comm_rank(MPI_COMM_WORLD,&my_id);
MPI_Scatter(buf, size / my_size, MPI_CHAR, recv_vect,
size / my_size, MPI_CHAR, 0, MPI_COMM_WORLD);
local_acum=0;
for (i=0; i < size / my_size; i++){
// printf("%c", buf[i]);
if (buf[i] == ' '){
local_acum++;
}
}
printf("\nlocal is %d \n", local_acum);
acum=0;
MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce(&local_acum, &acum, 1, MPI_INT, MPI_SUM,
0, MPI_COMM_WORLD);
if (my_id == 0){
printf("Counter is %d \n", acum);
}
// Finalize the MPI environment.
MPI_Finalize();
}
我没有得到想要的结果。
如果我 运行 使用选项 -np 1 它工作完美(正如预期的那样)。
然而,当我 运行 使用选项 -np 2 或更高时,我没有得到我的愿望 结果。 每个节点的行为是它总是计算相同数量的空白 spaces!我相信这是问题的关键。
如果在我的节点中
for (i=0; i < sie; i++)
这会计算空白 space 的数量。所以每个节点都有整个缓冲区。我不明白为什么因为在散点图中我告诉 pass (size / my_size)
- 您正在遍历
buf
,它包含整个文件,而不是recv_vect
,它只包含每个等级的部分。 - 您正在每个节点上读取整个文件,而不仅仅是在根节点上。这对你的情况没有任何意义。