Algorytm realizacja MPI

0

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

Czemu nie Znasz ilości słów? A nie Możesz wczytać wszystkich do tablicy, a potem zastosować patern taki jak fork join z Javy?

0

Pisałem tak przykładowo jeżeli bym tej ilości nie znał. No ale na potrzeby tego eksperymentu mogę przyjąć stałą wartość 2965156 słów które mam w pliku.

Wydaje mi się że wczytanie takiej ilości do tablicy się nie sprawdzi. A jeżeli się mylę to jak to miało by być realizowane w MPI?

0

Nie wiem, znam MPI, znam Javę i podaję wzorzec, Poszukaj czy jest podobny w MPI. Wyszukiwarka coś tam wyrzuca: https://duckduckgo.com/?q=fork+join+in+MPI&t=canonical&ia=web

0

Ok poszukam. A możne można jakoś inaczej

1 użytkowników online, w tym zalogowanych: 0, gości: 1