0
我希望這個代碼做的是以下幾點:(!做工不錯)的openmpi並行讀取文本文件
讀取一個文件到緩衝區(而不想改變我讀文件,也不我如何存儲它)。
跨越多個「節點」使用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++)
此計算空格的數目。所以每個節點都有整個緩衝區。我不明白爲什麼,因爲在分散我告訴傳遞(尺寸/ my_size)