Non-sequential Computing

Hints for general array insertion

1. fáze: každý prvek bi zařazovaného pole B[1..k] bude mít své vlákno, které ho zatřídí do stromu metodou Search (viz vzorový kód). Výsledkem bude pomocné pole C[1..k], obsahující pro každý prvek bi  odkaz na list stromu, vlevo od něhož se má bi  připojit. 

2. fáze: potřebujeme nyní identifikovat všechny neprázdné řetězce B1, ..., Bm (jejich počet m předem neznáme), které se budou vkládat mezi listy stávajícího stromu. Na obr. 6.6 ve skriptech to vypadá jednoduše, ale uvědomte si, že algoritmus ty řetězce "nevidí." Musíme mu sdělit, kde v poli B začínají a končí. Začátek každého řetězce zjistíme jednoduše v poli C -  je to pozice, jejíž obsah je odlišný od pozice předchozí. Sekvenčně by to byla hračka, ale my to musíme paralelizovat. 

Proto vytvoříme pomocné binární pole D[1..k] s jedničkami na počátečních pozicích řetězců:

D[1]: = 1

for 2 ≤ ≤ k pardo

   if C[-1] ≠ C[ithen D[i] := 1

   else D[i] := 0

Následně spočteme prefixovou sumu pole D a výsledek uložíme do pole E. V prvcích pole E nyní máme očíslování jednotlivých řetězců B1, ..., Bm. Všimněte si, že jejich počet je m = E[k]. Konečně vytvoříme pole F[1..m+1], které bude obsahovat indexy začátků řetězců Bi v poli B:

F[1] := 1

for 2 ≤ ≤ k pardo

   if E[-1] ≠ E[ithen F[E[i]] := i

F[m+1] := k+1 

Každý řetězec Bi  začíná na pozici F[i] a končí na pozici F[i+1]-1. Příklad pro k = 8, m = 4:

C

a1a2a2a2a5a5a9a9


D

11001010


E

12223344


F

12579


3. fáze: pro každý řetězec Bi  se spustí samostatné vlákno, které ho bude zařazovat. Zamkne rodičovský uzel p listu ai , k němuž se Bi  připojuje, a přidá k němu prostřední prvek Bi  jako nový list. Pro každé ze dvou zbývajících neprázdných půlek Bi  spustí samostatné vlákno, které se bude chovat analogicky, viz obr. 6.6 ve skriptech. Nyní se spustí metoda Balance, kterou lze myslím použít beze změny z jednoduché verze algoritmu. Stejně tak zamykání a odemykání rodičovského uzlu.  

Oproti skriptům je implementace zjednodušená, není nutno synchronizovat jednotlivé vlny vyvážení stoupající stromem, stačí vždy zamknout a vyvážit jen uzel, ke kterému se navěšuje nový potomek.