Jméno studenta: | David Šafránek, Martin Fiala |
Studijní skupina: | 5/38 |
Semestr, školní rok: | zimní 2005/2006 |
Katedra: | počítačů (K 13136) |
Předmět: | Paralelní systémy a algoritmy (36PAR) |
Seminář: | středa 16:15 |
Cvičící: | RNDr. Martin Nehéz |
Přednášející: | Prof. Ing. Pavel Tvrdík, CSc. |
Datum: | 17.12.2005 |
Sachovnice S[1..m,1..n].
Priklady hlavnich diagonal D kdyz n nedeli m beze zbytku:
a) m a n jsou licha,
b) m je sude a n je liche,
c) m je liche a n je sude,
d) m a n jsou suda.
Mnozina jezdcu L obsahuje k/2 jezdcu umistenych po radcich v dolni casti sachovnice S pod hlavni diagoalou D.
Mnoziny U a L jsou stredove symetricke (viz dalsi obrazek).
Pocatecni stav je dan mnozinami U cernych jezdcu a L bilych jezdcu. Kazdy jezdec se muze na sachovnici pohybovat podle sachovych pravidel (tah ve tvaru pismene L a muze tahnout pouze na volne pole). Cilem hry je stridanim tahu bilych a cernych jezdcu prevest pocatecni stav na cilovy, ve kterem cerni jezdci obsadi oblast L a bili obsadi oblast U.
Pocatecni a cilovy stav pro n=m=5 a k=16.
Sekvencni algoritmus je typu BB-DFS s neomezenou hloubkou (pri tazich jezdcu mohou vznikat cykly). Hloubku prohledavani musime omezit horni mezi (viz dale). Cena, kterou minimalizujeme, je pocet tahu. Protoze neni znama presna dolni mez na cenu reseni, algoritmus konci, kdyz prohleda cely stavovy prostor do hloubky dane horni mezi.
Pasy R(1),..,R(3) pro sachovnici m=n=9, ktere deli jezdce od prekroceni diagonaly.
Trivialni (nepresnou) dolni mez na pocet tahu lze odhadnout takto: Jezdci vzdy musi prekrocit diagonalu pri prechodu z mnoziny U do mnoziny L (ci naopak z L do U). Jestlize pro kazdeho jezdce na poli S[i,j] urcime minimimalni pocet tahu nutnych pro prekroceni diagonaly, tak soucet techto poctu pro vsechny jezdce je trivialni dolni mez. Sachovnici muzeme rozdelit do pasu R(k) podle tohoto poctu tahu k. Pas je siroky vzdy 3 policka sachovnice a kopiruje tvar diagonaly (viz. obrazek). Jestlize secteme soucty jezdcu v pasech R(k) a pocty tahu k, dostaneme nasledujici priblizny vyraz (plati pro m=n):
n/3 2 * SUMA { j * sqrt [ (n-3(j-1))^2 + (n-3(j-1))^2 ] - 3 } j=1Protoze se obecne jedna o znacne slozity vyraz, k vycisleni trivialni dolni meze pouzijte nasledujici program.
Presna horni mez na cenu reseni take neni znama. Vzhledem k moznym cyklum vsak potrebujeme aspon jeji odhad, aby bylo mozne orezavat stavovy prostor. Protoze kazdy jezdec dokaze projit celou sachovnici v mn tazich a tudiz v mnk tazich vsichni jezdci navstivi vsechna policka sachovnice, melo by byt reseni nalezeno maximalne v mnk tazich. Vzhledem k neexistenci presne dolni meze je nutne projit cely stavovy prostor do teto hloubky.
Algoritmus funguje pro instance velikosti 4x3x2 (mxnxk) až po zhruba 30x30x2. Maximální teoretická hodnota je dána velikostí buffery použitého pro reprezentace šachovnice s okraji. Zadaní je možné zjednodušit na pokládání jezdců jedné barvy zleva nahoře a duhé barvy zprava dole, protože díky složitosti nikdy nemůžeme položit více jezdců než je šířka řádku. Dále by se mohla zrušit podmínka m > n.
Podle zadání stačí pro určení zadání napsat par m n k.
Tedy např. pro šachovnici velikosti 10x5 se 2 jezdci na každé straně se zadá par 10 5 4.
Tahy jsou ve formátu zdrojové-cílové pole. Pole se značí písmenem udávajícím x-ovou souřadnici následovaným číslem udávajícím y-ovou souřadnici.
Pro přepis sekvenčního na paralelní řešení je potřeba mít naimplementované prohledávání stavového prostoru pomocí zásobníku, ale ne rekurzivním voláním funkcí.
Má-li procesor prázdný zásobník žádá následující procesor o práci, dostane-li odpověď, že procesor práci nemá inkrementuje svůj lokální čítač a posílá znovu žádost.
Probíhá pomocí algoritmu peška uvedeného v [1].
Náš program má nastavenou granularitu počtem pozic které prozkoumá než se začne zabývat příchozími zprávami. Tento počet je nastaven na hodnotu 100 pozic, což odpovídá zhruba 100 000 lokálním operacím. Při vyšší hodnotě je granularita hrubá, odezva procesoru na zprávy příliš pomalá, a výpočtu se nezúčastní všechny procesory naráz. Při nižší hodnotě je granularita příliš jemná, a dochází k nadbytku režie.
Pro instance trvající do několika sekund (prozkoumává se málo pozic) se nevyplatí rozesílat ostatním procesorům data. V tomto případě se čas při zvýšení počtu procesorů nesníží, ale také nezvýší.
Pro měření paralelního času bylo nutné na začátek a na konec měření přidat bariéru, na které se všechny procesory sesynchronizují. Vzhledem k skokovým časům výpočtu, kdy zvýšení hloubky řešení o 2 znamená zvýšení času v stonásobcích. Proto bylo nalézt sekvenční instance trvající daný čas (5, 10, 15 minut) absolutně nemožné. Nelehké bylo i nalezení instance trvající podobný čas (2 minuty). Měření jsme provedli pro 2, 4, 8 a maximální možný počet dvanácti procesorů. Vzhledem k potřebné době stačilo pro 2 a 4 procesory vkládat do fronty bez parametru long.
Graf zrychlení a podrobná měření jsou v příloze.
K superlineárnímu zrychlení v naší úloze nedošlo. Důvod je, že sekvenční algoritmus uvažuje v prvním kroku ideální tah k řešení. Tudíž se řešení vyskytuje téměř na levém okraji prohledávaného stromu, a dělení u dna nezpůsobí, že by se řešení posunulo k jinému procesoru do levější části než původně. Měření potvrdilo, že sít mirinet je opravdu rychlejší než ethernetová. V našem případě zrychlení činilo přibližně 10%.
Pravděpodobně vhodnější místo dělení zásobníku u dna bylo použití dělení na prahu řežné výšky, režie by byla sice v tomto případě vyšší, ale pro nalezení prvního řešení by stačilo prozkoumat menší stavový prostor.
Podařilo se nám porovnat sekvenční a paralelní algoritmus. Zrychlení paralelního algoritmu není ideální, ale existují i jiné typy úloh u kterých se dosahuje daleko lepších výsledků. Zvlášť když je k dispozici ještě více procesorů, než jsme měli k dispozici my. U takových rozsáhlých clusterů je třeba si dát pozor na rychlost režie, která může s počtem procesorů neadekvátně stoupat.