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)