• Nem Talált Eredményt

Algoritmusok ábrázolása gráfok segítségével

In document Párhuzamos algoritmusmodellek (Pldal 145-149)

Animation 3.2: The oscillating blinker pattern (periodlength: 2)

K. Jensen: Coloured Petri Nets and the Invariant-Method, Theoretical Computer Science 14 (1981), 317–336

6. fejezet - Párhuzamos programok

6.2. Szekvenciális programok párhuzamosítása

6.2.6.2.1. Algoritmusok ábrázolása gráfok segítségével

A fejezet bevezetésében megismertünk egy gyakran alkalmazott algoritmus-ábrázolási lehetőséget, az úgynevezett pszeudokódot. Ennek segítségével az imperatív nyelveknél megszokott struktúrában tudjuk leírni eljárásainkat. A több-kevesebb programozási gyakorlattal rendelkező olvasó számára ezzel elég kifejező eszköz áll rendelkezésre az algoritmus végrehajtása során alkalmazandó műveletek és sorrendjük leírására. A pszeudokóddal megadott algoritmusok belső összefüggései azonban csak alaposabb elemzéssel válnak láthatóvá, ha egyáltalán sikerül megtalálni őket.

A gráfokkal való reprezentáció egyik legfontosabb célja, hogy az előbb említett összefüggéseket már az algoritmus leírása során megpróbáljuk megadni, vizuálisan is megjeleníteni.

Eleinte, a programozási nyelvek első generációihoz kötődve, a gyakorlatban előszeretettel alkalmazták az algoritmusok folyamatábrával történő reprezentációját.

6.2.6.2.1.1. Folyamatábrák

A folyamatábra egy irányított gráf, melynek csúcspontjai az egyes utasításokat, míg élei az egymásutániságot reprezentálják.

Egyszerűbb algoritmusok esetén segítségével nagyon szemléletesen ábrázolható az utasításvégrehajtás egymásra épülése, viszont a strukturált programozási nyelvek elterjedésével a használhatósága lecsökkent, mivel bizonyos folyamatábra szerkezetek csak nehézkesen alakíthatók át programszerkezetté. (Ilyen például a ciklusok közötti ugrálás. Egy jól strukturált programot teljesen széttördel egy ciklusmagok közötti ki-be ugrálás, követhetetlenné válik a vezérlés.)

A 6.1. ábrán mutatott folyamatábrán a buborékrendezés algoritmusa látható.

6.1. ábra - A buborékrendezés folyamatábrája.

Bár a folyamatábra alapján kiválóan elemezhető az algoritmus, nem teljesen magától értetődő, hogy lehet belőle megfelelően strukturált, ugró utasítást mellőző C programot írni (már ha valaki olyat szeretne).

Szintén nehéz megállapítani ez alapján, hogy esetleg milyen párhuzamosítási lépések alkalmazhatók rá.

6.2.6.2.1.2. Párhuzamos folyamatábrák

A folyamatábra modellt általánosíthatjuk a párhuzamosítás irányába. Alapvetően itt is az utasítások egymásutániságát fejezik ki az irányított élek, viszont be kell vezetnünk a párhuzamos ciklusnak megfelelő paraméteres élt is. Ezzel tudjuk kifejezni azt, hogy az adott paraméternek megfelelő mennyiségben egyidejűleg hajtjuk végre az utasításokat.

A 6.2. ábra a buborékrendezés párhuzamosított algoritmusát mutatja folyamatábrán.

6.2. ábra - A párhuzamos buborékrendezés folyamatábrája (ahol J halmaz típusú

változó).

Innen már csak egyetlen általánosítási lépés vezet az adatfolyam gráfokhoz. Ebben a modellben az utasítások egymásra épülése kiegészül az adatok lehetséges áramlásának reprezentációjával.

6.2.6.2.1.3. Adatfolyamgráfok

Egy adatfolyam gráfban az előzőekhez hasonlóan a csúcsokban találhatók az utasítások, amelyeket aktornak neveznek (6.3. ábra).

A gráf élei itt nem egyszerű egymásutániságot fejeznek ki, hanem tényleges adatáramlási lehetőséget.

Tekinthetjük őket adatcsatornának, így a gráf által reprezentált algoritmus működése gráfelméleti eszközökkel vizsgálható. (Az időbonyolultság meghatározása a leghosszabb út keresésére redukálódik, de értelmet nyer a gráf áteresztőképessége is az úgynevezett „pipeline" üzemelésnél. Ekkor az új bemeneten való számolást már az előtt elkezdhetjük, mielőtt az előző számítás eredménye elkészülne.)

Az adatfolyamgráfban áramló adatcsomagokat tokeneknek nevezzük.

Egy aktor akkor válik aktívvá (engedélyezetté), ha a bemenetein megadott feltételeknek megfelelően adattokenek állnak rendelkezésre.

Amint a gráf egy csomópontja aktívvá válik, azonnal működésbe lép, elvégzi a hozzá rendelt műveletet, az eredményt pedig egy token formájában a kimenő élre rakja. Egy kimenő élen több token is összegyűlhet, de a feldolgozási sorrendjük meg kell, hogy egyezzen a létrehozásuk sorrendjével. (Azaz az élek egyfajta FIFO adattárolónak tekinthetők.)

Észrevehetjük, hogy az adatfolyamgráfok némileg hasonlítanak a Petri-hálókhoz, azzal a különbséggel, hogy a tokeneknek itt konkrét adatcsomagok felelnek meg.

6.3. ábra - Különböző aktorok adatfolyamgráfokban.

Bemenő aktor.

Kimenő aktor.

Összeadó aktor.

Feltétel generátor.

Port elágazás; az A aktor kimenő tokenje egyidejűleg megjelenik a B és C aktorok bemenő portján.

Gyűjtő port; az A, illetve B kimenete akkor jelenik meg a C bemenő portján, ha az üres.

Kapu aktor; ha B-n jel van, a bemenő A-t átengedi a kimenő portra.

Az adatfolyamgráfok egyes komponenseire különböző feltételeket írhatunk elő, ami által különböző modelleket kapunk.

A legegyszerűbb esetben nem engedünk meg visszacsatolást a gráfban (irányított körmentes). Ilyen pl. a minimum kiválasztása, amit a 6.4. ábra mutat.

6.4. ábra - A legkisebb elem kiválasztása X = min{X

1

, X

2

, X

3

, X

4

}.

Összetettebb modellekben megengedünk visszacsatolást, de megkövetelhetjük például, hogy egy aktor csak akkor lépjen működésbe, ha a kimenő élein már nincs token. (Azaz az előző kimenetét a következő aktor már feldolgozta.) Pl. buborékrendezés, aminek leírása a 6.5. ábrán látható.

6.5. ábra - A buborékrendezés adatfolyamgáfja.

Az egyik legfejlettebb adatvezérelt modellben a tokenek feltorlódhatnak egy aktornál. A szinkronizálást a tokenekhez rendelt sorszámmal oldhatjuk meg. Az összetartozó bemenő adatokat azonos sorszámmal látjuk el.

Ha egy aktorhoz megérkeztek a megfelelő sorszámú tokenek, aktiválódik, és kiszámolja a kimenő tokenjeit, ellátva őket a bemenetekkel megegyező sorszámmal. Amennyiben időközben más sorszámmal is érkeznek tokenek, félreteszi őket mindaddig, míg abból is meg nem érkezett az összes, ami az aktiváláshoz szükséges.

Ilyen módon a számolás eredménye nem feltétlenül abban a sorrendben jelenik meg, mint ahogy a bemenetnél megadtuk.

6.2.6.2.1.4. Adatfüggőségi gráfok

A gráfreprezentációk tipikus vizsgálati módszere, hogy megcseréljük az élek és csúcsok szerepét. Esetünkben ez azt jelenti, hogy az új gráfmodellben az élek reprezentálják az utasításokat, míg a csúcsok az adatokat, amire az utasításokat alkalmazzuk. Mivel egy-egy utasítás egyidejűleg több adaton is végezhet műveletet, a gráfot célszerű hipergráfnak választani. Ilyen módon az adatok közötti függőségi viszonyokat tudjuk szemléletesen megjeleníteni. A nyomonkövethetőség miatt az adatok különböző előfordulásait különböző reprezentánssal jelöljük. Az adatok függőségének több szintje létezik, amelyekről a későbbiekben még bővebben tárgyalunk.

In document Párhuzamos algoritmusmodellek (Pldal 145-149)