特別地,探討動態多線程算法的完美模型,它適合算法的設計和分析,並且能再實際應用中有效實現。
動態多線程:是一類重要的並發平台。程序員只需描述應用中的並行性,這種並發平台包含一個調度器,能自動地進行負載平衡計算,大大減輕了程序員的負擔。
特征:嵌套並行、並行循環。
重點關注:工作量、持續時間和並行度的度量標准,這些將用於分析多線程算法。
case:斐波那契數列
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,...
線性遞推數列
單位階躍函數如下:
代碼1:
1 int FIB(n){ 2 3 if n <= 1 4 5 return 1; 6 else 7 8 return FIB(n - 1) + FIB(n - 2); 9 }
問題剖析:
當n > 1, 比如2的時候, FIB(0) 會被調用兩次。如果是更大的值,必然會出現一個結果重復調用的工作。如下圖:
時間復雜度為:T(n) = Θ(Ø^n),是以的指數增長,這個過程用來計算斐波那契數列是個相當慢的方法。——得出結論:低效的方法。
代碼2(升級版):采用動態多線程來重寫FIB過程,利用代碼1中FIB(n-1)和FIB(n-2)彼此獨立的特點,可以采用並行計算的方式升級過程。
int P-FIB(n) if n <= 1 return n; else int x = spawn P-FIB(n - 1) int y = P-FIB(n - 2) sync return x + y
關鍵字spawn的作用:嵌套並行調用。父進程派生子進程,與P-FIB(n - 2)並行執行。
關鍵字sync作用:同步語句。執行完sync之后,一個過程(父進程)才能安全地使用其派生子過程(子進程)的返回值。sync表明,過程在執行sync后面的語句前,必須等到它的所有派生子過程計算完成。
分析:
時間復雜度由代碼1的 T(n) = T(n-1) + T(n-2) 升級為T(n) = max(T(n-1), T(n-2)) ;
這里我們要理解一個重要的圖分析:有向無環圖
公式:G=(V,E)
——V,代表定點(指令);
——Ε ,代表邊(指令間的依賴關系);
----如:(μ, ν) ∈ Ε 表示指令 μ必須在 ν之前執行。
