2016-10-22 14 views
0

Was möchte ich mit diesem Code zu tun, ist die folgende: (! Funktioniert gut)OpenMPI parallelisieren Lesen einer Textdatei

Lesen Sie eine Datei in einen Puffer (und wollen nicht ändern, wie ich die Datei lesen noch wie ich es gespeichert habe).

Senden Sie diesen Puffer mit MPI_Scatter über mehrere "Knoten". So kann jeder Knoten zählen, wie oft es Leerzeichen gibt.

Der Code, den ich gemacht habe, ist die folgende:

#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(); 
} 

ich nicht das gewünschte Ergebnis zu bekommen.

Wenn ich mit der Option -np 1 laufen, funktioniert es perfekt (wie erwartet).

Aber wenn ich mit der Option -np 2 oder höher laufen, bekomme ich nicht mein Wunsch Ergebnis. Das Verhalten jedes Knotens ist, dass es immer die gleiche Anzahl von Leerzeichen zählt! Ich glaube, das ist der Schlüssel zum Problem.

Wenn in dem Knoten für mich

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

Dies zählt die Anzahl der Leerstellen. Jeder Knoten hat also den ganzen Puffer. Ich verstehe nicht, warum da in der Streuung ich sage passieren (Größe/my_size)

Antwort

1
  1. Sie iterieren buf, die die gesamte Datei enthält, statt recv_vect, die für jeden Rang nur den Teil enthält.
  2. Sie lesen die gesamte Datei auf jedem Knoten, nicht nur auf der Wurzel. Das macht in deinem Fall keinen Sinn.