❚❡r♠✐♥❛t✐♦♥ ❉❡t❡❝t✐♦♥ ❢♦r ❉✐✛✉s✐♥❣ ❈♦♠♣✉t❛t✐♦♥s ❙❤❛♥❦❛r ❆♣r✐❧ ✷✻✱ ✷✵✶✽
❖✈❡r✈✐❡✇ ❉✐✛✉s✐♥❣ ❝♦♠♣✉t❛t✐♦♥ ❞✐str✐❜✉t❡❞ ❝♦♠♣✉t❛t✐♦♥ ✇❤❡r❡ ❡❛❝❤ ✉s❡r ✐s ❛❝t✐✈❡ ♦r ✐♥❛❝t✐✈❡ ❛❝t✐✈❡✿ s❡♥❞✴r❝✈ ♠s❣s✱ ❜❡❝♦♠❡ ✐♥❛❝t✐✈❡ ✐♥❛❝t✐✈❡✿ ❜❡❝♦♠❡ ❛❝t✐✈❡ ✉♣♦♥ r❝✈✐♥❣ ❛ ♠s❣ st❛rts ✇✐t❤ ♦♥❡ ❛❝t✐✈❡ ✉s❡r✱ s❛② a0 ❆❧❣✲❧❡✈❡❧ ♣r♦❣r❛♠ ♦❢ ❉✐❥❦str❛✲❙❝❤♦❧t❡♥ ❛❧❣♦r✐t❤♠ ❢♦r t❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥ ♦❢ ❞✐✛✉s✐♥❣ ❝♦♠♣✉t❛t✐♦♥ ❘❡✜♥❡ t♦ ❛✇❛✐t ♣r♦❣r❛♠ t❤❛t ✐♠♣❧❡♠❡♥ts TdChannel ❢♦r ❝❛s❡ ✇❤❡r❡ ♦♥❧② t❤❡ s✐♥❦ ✐s ❛❝t✐✈❡ ✐♥✐t✐❛❧❧②
❖✉t❧✐♥❡ ❛❧❣✲❧❡✈❡❧ ❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥✿ ❛❧❣♦r✐t❤♠ ❧❡✈❡❧ ❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥✿ ❛✇❛✐t✲❜❛s❡❞ ♣r♦❣r❛♠
❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥ ❛❧❣♦r✐t❤♠✿ ♦✈❡r✈✐❡✇ ❛❧❣✲❧❡✈❡❧ ❉✐str✐❜✉t❡❞ ♣r♦❣r❛♠ TdDiffusingDist st❛rts ❛ ✜❢♦ ❝❤❛♥♥❡❧ ❛♥❞ ❛ s②st❡♠ ❛t ❡❛❝❤ ❛❞❞r j ▼❛✐♥t❛✐♥s ❛ ❞✐str✐❜✉t❡❞ ♦✉t✲tr❡❡ r♦♦t❡❞ ❛t a0 ♦✈❡r ❛❝t✐✈❡ ✉s❡rs ❡①❛❝t❧② ♦♥❡ ❞✐r❡❝t❡❞ ♣❛t❤ ❢r♦♠ a0 t♦ ❡✈❡r② ❛❝t✐✈❡ ✉s❡r ♣❛t❤ ♠❛② ❣♦ ✈✐❛ ♥♦♥✲❧❡❛❢ ✐♥❛❝t✐✈❡ ✉s❡rs ♥♦ ♦t❤❡r ❡❞❣❡s✱ ✐❡✱ ♥♦ ✉♥❞✐r❡❝t❡❞ ❝②❝❧❡ ❈r❡❛t❡s [j,k] ✇❤❡♥ ♥♦♥✲tr❡❡ k r❝✈s ❛ j ✲♠s❣ ❉❡❧❡t❡s [j,k] ✇❤❡♥ k ✐s ❛ ❧❡❛❢ ❛♥❞ ✐♥❛❝t✐✈❡ a0 ❞❡t❡❝ts t❡r♠✐♥❛t✐♦♥ ✇❤❡♥ ✐t ✐s ✐♥❛❝t✐✈❡ ❛♥❞ ❛ ❧❡❛❢ ❯s❡r ✜♥❞s ♦✉t ✐t ✐s ❛ ❧❡❛❢ ✈✐❛ ❛❝❦s t♦ ✉s❡r ♠s❣s
❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥ ❛❧❣♦r✐t❤♠ ❛❧❣✲❧❡✈❡❧ ❙②st❡♠s✱ ❡❛❝❤ ✇✐t❤ ❛ ✉s❡r✱ ❛tt❛❝❤❡❞ t♦ ❛ ✜❢♦ ❝❤❛♥♥❡❧ ❯s❡rs ❡①❝❤❛♥❣❡ ♠s❣s✱ ✇❤✐❝❤ s②st❡♠s r❡❧❛② ♦✈❡r ✜❢♦ ❝❤❛♥♥❡❧ ❙②st❡♠ ♠❡ss❛❣❡s ❞❛t❛ ♠s❣ [ DAT, sender addr, user msg ] ❛❝❦ ♠s❣ [ ACK ] ❙②st❡♠ j ✈❛rs active ✿ ✐♥✐t✐❛❧❧② tr✉❡ ❢♦r a0 ✱ ♦✴✇ ❢❛❧s❡ engager ✿ ✐♥✐t✐❛❧❧② a0 ❢♦r a0 ✱ ♦✴✇ null / ✏✉♣✲str❡❛♠✑ ♥❡✐❣❜♦r ✐❢ j ✐♥ t❤❡ tr❡❡✱ ♦✴✇ ♥✉❧❧ / unAcked ✿ ✐♥✐t✐❛❧❧② 0 / ★ ♦❢ ✉♥❛❝❦❡❞ ♦✉t❣♦✐♥❣ ❞❛t❛ ♠s❣s /
❙②st❡♠ j r✉❧❡s ✕ ✶ ❛❧❣✲❧❡✈❡❧ ♦♥❧② ✐❢ active = tr✉❡✿ active ← ❢❛❧s❡ ♦♥❧② ✐❢ active s❡♥❞ [DAT,j,umsg] t♦ k unAcked + + r❡❝❡✐✈❡ [DAT,k,dmsg] ✿ active ← true ✐❢ engager = null engager ← k ❡❧s❡ s❡♥❞ [ACK] t♦ k
❙②st❡♠ j r✉❧❡s ✕ ✷ ❛❧❣✲❧❡✈❡❧ r❡❝❡✐✈❡ [ACK] unAcked-- ❉✐s❡♥❣❛❣❡ ♦♥❧② ✐❢ ✭♥♦t active ❛♥❞ unAcked = 0 ❛♥❞ engager � = null ✮ ✐❢ j = a0 s✐❣♥❛❧ t❡r♠✐♥❛t✐♦♥ ❡❧s❡ s❡♥❞ [ACK] t♦ engager engager ← null ❆ss✉♠♣t✐♦♥s r✉❧❡s ❛r❡ ❛t♦♠✐❝ ✇❡❛❦ ❢❛✐r♥❡ss ❢♦r ❞✐s❡♥❣❛❣❡
❆♥❛❧②s✐s ❛✉①✐❧✐❛r② q✉❛♥t✐t✐❡s ❛❧❣✲❧❡✈❡❧ numDAT(j) ✿ # ❞❛t❛ ♠s❣s ✐♥ tr❛♥s✐t ♦✉t❣♦✐♥❣ ❢r♦♠ j numACK(j) ✿ # ❛❝❦ ♠s❣s ✐♥ tr❛♥s✐t ✐♥❝♦♠✐♥❣ t♦ j termination ✿ forall(j: not j.active and numDAT(j) = 0) eNodes ✿ set(j: j.engager � = null) / ❡♥❣❛❣❡❞ ♥♦❞❡s / eEdges ✿ bag([k.engager, k]: k � = a0, k.engager � = null) / ❡♥❣❛❣❡♠❡♥t ❡❞❣❡s / eGraph ✿ [eNodes, eEdges] / ❡♥❣❛❣❡♠❡♥t ❞✐❣r❛♣❤ /
❆ss❡rt✐♦♥s t♦ ❜❡ ♣r♦✈❡❞ ❛❧❣✲❧❡✈❡❧ ❙❛❢❡t② ⇒ A ✶ : ■♥✈ (a0.unAcked = 0 and not a0.active) termination Pr♦❣r❡ss A ✷ : termination ❧❡❛❞s✲t♦ (a0.unAcked = 0 and not a0.active)
Pr♦♦❢ ♦❢ A ✶ ❛❧❣✲❧❡✈❡❧ ■♥t❡r♠❡❞✐❛t❡ ♣r❡❞✐❝❛t❡s B ✶ : eGraph ✐s ❛♥ ♦✉t✲tr❡❡ r♦♦t❡❞ ❛t a0 B ✷ : j.unAcked = numDAT(j) + numACK(j) + sum([j,k]: [j,k] in eEdges) B ✸ : j.engager = [] ⇒ (not j.active and j.unAcked = 0) ■♥✈ B ✶ ✕ B ✸ ✿ B ✶ ✕ B ✸ s❛t✐s✜❡s ✐♥✈❛r✐❛♥❝❡ r✉❧❡ B ✶ ✕ B ✸ ✐♠♣❧✐❡s A ✶ ✬s ♣r❡❞✐❝❛t❡ ❤❡♥❝❡ A ✶ ❤♦❧❞s
Pr♦♦❢ ♦❢ A ✷ ❛❧❣✲❧❡✈❡❧ A ✷ : termination ❧❡❛❞s✲t♦ (a0.unAcked = 0 and not a0.active) ❆ss✉♠❡ termination / ❛❧❧ ✐♥❛❝t✐✈❡✱ ♥♦ ❞❛t❛ ♠s❣s ✐♥ tr❛♥s✐t / ❆ss✉♠❡ eEdges ✐s ♥♦t ❡♠♣t② s♦ t❤❡r❡ ✐s ❛ ❧❡❛❢ ♥♦❞❡ j j ❤❛s ♥♦ ♦✉t❣♦✐♥❣ ❞❛t❛ ♠s❣s ♦r ✐♥❝♦♠✐♥❣ ❡❞❣❡s j ✬s ✐♥❝♦♠✐♥❣ ❛❝❦s ❛r❡ ❡✈❡♥t✉❛❧❧② r❝✈❞ s♦ j.unAcked ❜❡❝♦♠❡s 0 ❛♥❞ st❛②s s♦ s♦ j s❡♥❞s ❛♥ ❛❝❦ t♦ ✐ts ❡♥❣❛❣❡r ❛♥❞ ❧❡❛✈❡s t❤❡ tr❡❡ ❊✈❡♥t✉❛❧❧② eEdges ✐s ❡♠♣t② ❛♥❞ a0.unAcked ✐s 0
❖✉t❧✐♥❡ ❛✇❛✐t ♣r♦❣r❛♠ ❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥✿ ❛❧❣♦r✐t❤♠ ❧❡✈❡❧ ❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥✿ ❛✇❛✐t✲❜❛s❡❞ ♣r♦❣r❛♠
❚❡r♠✐♥❛t✐♦♥ ❞❡t❡❝t✐♦♥ ♣r♦❣r❛♠ ❛✇❛✐t ♣r♦❣r❛♠ ❉✐str✐❜✉t❡❞ ♣r♦❣r❛♠ TdDiffusingDist ( ADDR, a0 ) / / ✐♠♣❧❡♠❡♥ts TdChannel ❢♦r ♦♥❧② ❛✵ ✐♥✐t✐❛❧❧② ❛❝t✐✈❡ { cj } ← st❛rt FifoChannel(ADDR) ❢♦r j ✐♥ ADDR vj ← st❛rt TdDiffusing (ADDR, j, a0, cj) r❡t✉r♥ { vj } TdDiffusing ✿ ❛✇❛✐t ♣r♦❣r❛♠✱ r❡✜♥❡s ❛❧❣✲❧❡✈❡❧ s②st❡♠ ✐♥♣✉t ❢♥s✿ tx ✱ rx ✱ inactive ✱ isTerminated ✭♦♥❧② ❛t a0 ✮ ♦✉t♣✉t ❝❛❧❧s✿ tx ✱ rx ♦❢ ❝❤❛♥♥❡❧ ❛❝❝❡ss s②st❡♠
Pr♦❣r❛♠ TdDiffusing ✿ ♦✈❡r✈✐❡✇ ❛✇❛✐t ♣r♦❣r❛♠ P❛r❛♠❡t❡rs ADDR ✱ ❧♦❝❛❧ ❛❞❞r j ✱ s✐♥❦ ❛❞❞r a0 ✱ ❝❤❛♥♥❡❧ ❛❝❝❡ss s②st❡♠ cj ■♥♣✉t ❢♥s ✭❝❛❧❧❡❞ ❜② ✉s❡r✮ tx(k,msg) rx() / ✐♥❞✐❝❛t❡s ✉s❡r ✐♥❛❝t✐✈❡ inactive() / isTerminated() ✭♦♥❧② ❛t a0 ✮ / r❡t✉r♥ ♦♥❧② ✐❢ t❡r♠✐♥❛t✐♦♥ / ▲♦❝❛❧ ❢♥ doRx() ✱ ❡①❡❝✉t❡❞ ❜② ❧♦❝❛❧ t❤r❡❛❞ r❝✈s ♠s❣ ❢r♦♠ ❝❤❛♥♥❡❧✱ ✉♣❞❛t❡ t❞ st❛t❡ ❛❞❞ ✉s❡r ♠s❣ ✭✐❢ ❛♥②✮ t♦ ❛ ❜✉✛❡r / ✉s❡r r❝✈s ❢r♦♠ ❜✉✛❡r / / ✐t✬s ♣❛rt ♦❢ ✉s❡r ✇rt t❞ st❛t❡ /
Pr♦❣r❛♠ TdDiffusing ✕ ✶ ❛✇❛✐t ♣r♦❣r❛♠ ▼❛✐♥ active ← (j = a0) engager ← if (j = a0) a0 else null unAcked ← 0 rxq ← [] / ❜✉✛❡r ❢♦r r❝✈❞ ✉s❡r ♠s❣s / / r❝✈s ♠s❣s ❢r♦♠ ❝❤❛♥♥❡❧ startThread ( doRx() ) / ✐♥♣✉t mysid.tx(k, msg) ❛✇❛✐t (true) unAcked + + cj.tx(k, [DAT, j, msg]) r❡t✉r♥
Pr♦❣r❛♠ TdDiffusing ✕ ✷ ❛✇❛✐t ♣r♦❣r❛♠ ✐♥♣✉t mysid.rx() ❛✇❛✐t (rxq.size > 0) msg ← rxq[0] rxq.remove() r❡t✉r♥ msg / r❡t✉r♥ [msg,k] / ✐♥♣✉t mysid.inactive() ❛✇❛✐t (true) ✐❢ rxq = [] active ← false ✐❢ ✭❥ � = ❛✵ ❛♥❞ ✉♥❆❝❦❡❞ = ✵✮ / ❞✐s❡♥❣❛❣❡ cj.tx( engager, [ACK] ) / engager ← null
Pr♦❣r❛♠ TdDiffusing ✕ ✸ ❛✇❛✐t ♣r♦❣r❛♠ ❢✉♥❝t✐♦♥ doRx() / ❡①❡❝✉t❡❞ ❜② ❛ ❧♦❝❛❧ t❤r❡❛❞ / ✇❤✐❧❡ true msg ← cj.rx() / ✐❛ {msg ✐s [DAT, k, msg] ✱ [ACK]} / ❛✇❛✐t true ✐❢ msg = [DAT, k, msg] rxq.append(msg) active ← true ✐❢ (engager = null) engager ← k ❡❧s❡ cj.tx(k, [ACK]) ❡❧s❡ ✐❢ msg = [ACK] unAcked -- ✐❢ ✭ j � = a0 and unAcked = 0 and not active ✮ cj.tx( engager, [ACK] ) / / ❞✐s❡♥❣❛❣❡ engager ← null
Recommend
More recommend