2016-10-22 88 views
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)

回答

1
  1. 你迭代buf,其中包含了整個文件,而不是recv_vect,其中只包含每個等級的一部分。
  2. 您正在讀取每個節點上的整個文件,而不僅僅是根目錄。這對你的情況沒有任何意義。