Documente Academic
Documente Profesional
Documente Cultură
Obiective
După realizarea acestei teme de casă studentul va fi capabil să:
• proiecteze un algoritm paralel pornind de la un algoritm secvential pentru problema “Game of Life”.
• programare in C si OpenMP.
Enunţul problemei
Pentru modelarea unor populatii de indivizi, matematicianul britanic J. H. CONWAY a introdus in anul 1970 regulile jocului
"Game of Life". Acesta nu este chiar un joc, deoarece nu este nevoie de interactiunea cu utilizatorul (este un “zero player
game”) fiind doar o evolutie, dupa anumite reguli, a unei colonii de organisme vii.
Jocul se desfasoara pe o suprafata dreptunghiulara impartita in celule (ca in figura de mai jos). Spunem ca o celula este
ocupata daca acolo se afla un organism viu, altfel spunem ca celula respectiva nu e ocupata. Celulele ocupate se
considera a fi in viata, celelalte fiind moarte. La fiecare noua generatie unele organisme pot muri altele pot deveni vii.
1. Vecinii unei celule sunt sunt cele 8 celule din jur cu care exista cel putin un punct de contact (pe orizontala, pe
verticala sau pe diagonala).
2. Daca o celula este vie, dar nu are nici un vecin viu, sau doar un singur vecin viu, atunci ea va muri de singurate
in generatia urmatoare.
3. Daca o celula este in viata si are patru sau mai multi vecini vii, atunci ea va muri "sufocata" in generatia
urmatoare.
4. O celula cu doi sau trei vecinii vii va trai si in generatia urmatoare.
5. O celula moarta va invia in generatia urmatoare doar daca are exact trei vecini vii in generatia curenta. Celelalte
celule moarte vor ramane moarte si in generatia urmatoare.
6. Toate nasterile si mortile au loc simultan - o celula care moare poate ajuta sa dea nastere la una noua (intr-o
celula vecina) in generatia urmatoare, dar nu poate preveni moartea unei celule vecine.
Numim configuratie modul in care sunt aranjate pe tabla de joc celulele vii si moarte intr-o generatie. Trecerea dintr-o
configuratie in alta se face conform regulilor de mai sus.
Figura 1. Tabla de joc pentru “Game of Life” ilustrand trei situatii posibile.
Vom considera ca fiecare celula are 8 vecini. Astfel celulele din prima linie se vor invecina in partea de sus cu celulele din
ultima linie, iar celulele din ultima linie se vor invecina in partea de jos cu cele din prima linie. Analog se petrec lucrurile cu
prima si ultima coloana. Celula din colt va avea ca vecini cele trei celule din jurul ei, cele doua din ultima linie (primele 2
coloane), cele doua din ultima coloana (primele 2 linii) si cea din coltul diagonal opus, de jos. Analog pentru celelate
colturi ale tablei de joc.
Pentru a implementa regulile de trecere de la o generatie la alta se vor folosi 2 zone de memorie. In prima se retine
configuratia initiala, iar in a doua configuratia finala. Daca folositi o singura zona de memorie riscati sa nu obtineti
rezultatele corecte.
Simularea trecerii de la o generatie la alta se va face in paralel folosind conceptul de memorie partajata. Implementarea
se va face in OpenMP. Vom cosidera ca avem o tabla de joc de dimensiune n x m si un numar de procesoare ce pot lucra
in paralel p, cu restrictia p <= min(n,m).
Problema se poate rezolva prin descompunerea tablei de joc in regiuni, fiecare procesor primind o regiune a tablei.
Descompunerea se poate face ca in figura 2.
Aplicatia voastra va simula un numar de iteratii ale jocului, folosind doar doua zone de memorie. La finalul unei
succesiuni de aplicare a regulilor se va inlocui generatia veche cu cea noua. Copierea unei zone de memorie in alta se
va face in paralel, folosind toate procesoarele.
3. Cerintele temei
Programul va incarca configuratia initiala dintr-un fisier primit ca parametru al liniei de intrare. In fisierul text se afla o
matrice n x m care contine elementele maticii, codificate astfel: 0 = celula moarta, 1 = celula vie.
Rezultatul se va scrie intr-un fisier de iesire care are acelasi format cu cel de intrare.
Numarul de iteratii pentru care se va simula jocul este dat ca parametru al liniei de comanda. Un exemplu de executie
este:
• <initial_board_file>: fisierul ce contine datele de intrare. Pe prima linie sunt 2 numere naturale, despartite printr-un
spatiu, ce reprezinta dimeniunea tablei. Liniile urmatoare contin configuratia initiala. Elementele unei linii pot fi 0 sau 1 si
sunt despartite printr-un spatiu.
● compilarea temei se va face pe un sistem linux folosind Omni OpenMP Compiler (http://phase.hpcc.jp/Omni/).