gpt4 book ai didi

c - OpenMPI 并行读取文本文件

转载 作者:行者123 更新时间:2023-11-30 15:04:45 25 4
gpt4 key购买 nike

我希望使用此代码执行以下操作:

将文件读入缓冲区(效果很好!)(并且不希望更改我读取文件的方式或存储文件的方式)。

使用MPI_Scatter跨多个“节点”发送该缓冲区,因此每个节点都可以计算空白的次数。

我编写的代码如下:

#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 或更高选项运行时,我没有得到我的愿望结果。每个节点的行为是它始终计算相同数量的空格!我相信这是问题的关键。

如果在节点中我这样做

for (i=0; i < sie; i++)

这会计算空格的数量。所以每个节点都有整个缓冲区。我不明白为什么在分散中我告诉要通过(size/my_size)

最佳答案

  1. 您正在迭代 buf,其中包含整个文件,而不是 recv_vect,后者仅包含每个等级的部分。
  2. 您正在读取每个节点上的整个文件,而不仅仅是根节点上的文件。这对你来说没有任何意义。

关于c - OpenMPI 并行读取文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40193384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com