Sunteți pe pagina 1din 2

Algoritmul Lanthier Algoritmul dat de Lanthier este special realizat pentru o implementare utilizand message passing.

Este bazat pe algoritmul lui Dijkstra, dar modificat astfel incat nodirule individuale pot procesa pentru o perioada mai lunga prin marirea intervalului de sincronizare. Algoritmul este descris intr-un mod sa fie neutru pentru implementare bazata pe transmiterea de message sau cea bazata pe memorie comuna. Dar acesta a fost descries de Lanthier ca fiind un algoritm special bazat pe comunicarea prin message. Aceasta forma este prezentata mai jos. V = set of all vertices in partition for each v in V: v.setCost( infinity ) if s is in V: s.setCost( 0 ) Q.push( s ) do until quit: if have incoming message: cost token (newmaxcost, originatorrank): set maxcost to newmaxcost if rank != originatorrank: send cost token (newmaxcost, originatorrank) to (rank+1)%size done token (timesround, originatorrank): if rank = originatorrank and timesround = 2: send terminate to (rank+1)%size quit else: done = (timesround, originatorrank) updated cost msg (GVertex v,cost): if cost < v.getCost(): v.setCost( cost ) update / reorder v on Q terminate msg: send terminate to (rank+1)%size if Q.empty() || localcost > maxcost: if done is not NULL: if done.originatorrank = rank: done.timesround = done.timesround + 1 send done token (timesround,originatorrank) to (rank+1)%size wait for incoming message else:

v = Q.pop() localcost = v.getCost() if localcost < maxcost: if v = t: maxcost = v.getCost() send cost token (v.getCost(), rank) to (rank+1)%size else: for each GVertex u adjacent to v: if u.getCost() > (v.getCost() + (cost between u and v)): u.setCost( u.getCost() + (cost between u and v) ) for each GVertex x in us shared list: send updated cost msg (x, u.getCost() ) to (cellx + celly * nx) Dupa cum se vede, mesagele au fost trimise round-robin printre noduri, evitand o comunicare colectiva si marind sincronizarea. Semnatul de terminare se realizeaza prin transmiterea done de doua ori prin noduri. Principala problema a implementarii este aceea ca bufarul de trimitere este folosit pretutindeni. Aceasta, deoarece fara acest bufer, poate sa apara deadlock, implementarea nu este sigura. Un exemplu in acest caz este unde doua procese incearca sa trimita si sa faca actualizarea costului unu celuilalt in acelasi timp. Solutia cu bufer nu este ideala dar a fost singura care a fost gasita.

Bibliografie: Alistair K Phipps : Parallel algorithms for geometric shortest path problems

S-ar putea să vă placă și