Chciałbym zrównoleglić w MPI ten kod działający na razie na jednym procesie.
Opis programu:
Program wypisuje anagramy słowa podanego przez użytkownika. Słowa czytane są z pliku.
Jednak jak to zrobić?
Myślałem o użyciu MPI scatter gather ale problem w tym że nie wiem jak mam dzielić słowa pomiędzy procesy skoro nie znam maksymalnej ilości wyrazów pobieranych z pliku(aktualnie pobierane są do tablicy za każdym razem gdy pętla odczyta słowo). W przypadku tablic liczb sprawa wydaje mi się dużo prostsza niż w przypadku znakowych.
Zacząłem pisać kod w MPI ale zatrzymałem się na tym etapie
Jestem nowy w MPI proszę o pomoc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <conio.h>
#include <mpi.h>
bool czy_anagram(char *a, char *b)
{
//wyznaczenie liczby liter w slowie a i w slowie b
int dl1 = strlen(a), dl2 = strlen(b);
//jesli dlugosci wyrazow nie sa rowne, to nie moga to byc anagramy
if(dl1!=dl2)return false;
int licz[0x100]={}; //zerujemy licznniki o długości 256
for(int i=0;i<dl1;i++)
licz[(unsigned char) a[i]]++; //zliczamy litery pierwszego wyrazu
for(int i=0;i<dl1;i++)
licz[(unsigned char) b[i]]--; //odejmowanie wystapien liter
for(int i=0;i<256;i++)
if(licz[i]!=0) //jesli ktorys licznik sie nie wyzerowal to slowa nie sa anagramami
return false;
return true; //jezeli wszystkie liczniki sie wyzerowaly, to mamy anagram
}
int main(int argc, char** argv) {
char a[101], b[101]; //dwa slowa, maksymalnie 100 znakow
FILE *pFile;
MPI_Init(NULL, NULL);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
pFile=fopen("slowa852.txt","r"); //otwieranie w trybie odczytu slownika zapisanego w kodowaniu OEM 852
//wproadzenie slowa ktorego anagramy maja byc wyszukane
printf("Podaj wyraz: ");
scanf ("%s", a);
if (pFile != NULL){
while ( fscanf (pFile,"%s",b) == 1) { //petla zczytujaca dzialajaca do konca wystapienia ostatniego wyrazu w pliku
if(czy_anagram(a,b))
printf("Wyraz %s jest anagramem!\n", b);
}
fclose(pFile); //zamykanie pliku
}
else{
printf("Nie mozna otworzyc pliku.\n");
}
MPI_Finalize();
}