加速(計算機並行應用程式設計術語)

加速(Speedup)是在多核機器上運行應用程式(相比單核機器)所能夠預期的性能收益。

基本介紹

  • 中文名:加速
  • 外文名:Speedup
  • 適用範圍:多核心或者多個硬體執行緒的CPU
  • 適用領域:計算機並行編程
定義,應用程式加速定律,阿姆德爾定律,古斯塔夫森定律,程式示例,

定義

加速(Speedup)是在多核機器上運行應用程式(相比單核機器)所能夠預期的性能收益。測量加速時,單核機器的性能為基線。例如,假設一個應用程式在單核機器上的持續時間是六小時,那么該應用程式在一個四核機器上運行時,持續時間減少到三個小時。換句話說,應用程式快了兩倍。
你可能會認為在單核機器上運行的應用程式在雙核機器上運行時會快兩倍,在四核機器上運行時會快四倍。但是,這並不完全正確。除了一些特例,比如超線性加速,即使整個應用程式都並行運行,線性加速也是不可能。這是因為總有一些並行應用程式的開銷,比如將執行緒調度到單獨的處理器。因此,線性加速是不可能實現的。
並行代碼線性加速具有以下限制:
1、串列代碼。
2、並行開銷。
3、同步。
4、順序輸入 / 輸出。

應用程式加速定律

阿姆德爾定律

預測加速在設計、基準評測以及測試並行應用程式時很重要。幸運的是,有計算加速的公式。其中一個公式是阿姆德爾定律。吉恩●阿姆德爾在1967年新建了阿姆德爾定律,用以計算並行應用程式的最大加速。
阿姆德爾定律基於三個變數來計算並行代碼的加速:
1、在單核機器上運行應用程式的持續時間。
2、並行應用程式的百分比。
3、處理器核心的數量。
下面是公式,它返回單核對多核性能的比率:
該公式以應用程式在單核機器上的持續時間為基準。
公式中的分子代表基礎持續時間,總是等於1。計算的動態部分在分母。變數P是並行應用程式的百分比,N是處理器核心的數量。
舉個例子,假設有一個應用程式,75%並行且運行在一個具有三個處理器核心的機器上。計算阿姆德爾定律的第一次疊代如下所示。在公式中,P是0.75(並行部分),N是3(核心數量)。
最終結果是,加速等於2。該應用程式在3個處理器核心的機器上運行時會快兩倍,即Speedup=2。

古斯塔夫森定律

約翰●古斯塔夫森和愛德華●巴西斯在1988年推出了古斯塔夫森定律,與阿姆德爾定律形成競爭關係。正如演示那樣,阿姆德爾定律預測處理器添加到計算環境之後的性能。這被稱為“加速”,代表性能收益。在現實世界中,性能收益有時會改變用途。金錢和計算能力的需要,都有一個共同的屬性。兩者都傾向於擴大消費可用資源。例如,一個應用程式在一個固定的期限內完成一個特定的操作。由此而來的性能收益可以被用來更快速地完成工作,但是,性能收益很有可能僅僅被用來在相同的固定期限內完成更多的工作。當這種情況發生時,性能收益並沒有傳遞給用戶。儘管這樣,應用程式完成了更多的工作或者提供了額外的功能。所以,我們仍然可以從運行在多核環境中的並行應用程式獲得顯著效益。
阿姆德爾定律沒有考慮到這些現實世界的問題。相反,他假設應用程式的並行和串列是一種固定的關係。應用程式可以分割為並行部分和串列(順序)部分。當其他處理器被添加後,阿姆德爾定律會保持這些比例。串列和並行部分各自保持程式的一半。但是,在現實世界,隨著計算能力的提高完成的工作更多,所以順序部分的相對持續時間減少。此外,阿姆德爾定律沒有考慮調度、管理和執行並行任務所需要的開銷。古斯塔夫森定律考慮了所有這些附加因素。
下面是使用古斯塔夫森定律計算加速的公式。
在上面的公式中,S是應用程式中串列代碼的百分比,N是處理器核心的數量,On是來自並行的開銷。

程式示例

下面的程式代碼是用來測試並行代碼的執行效率的,代碼語言:Visual Basic.NET(.NET Framework 4.0)。
Imports System.Threading.TasksModule MainConWin32   Private Sum As UInteger = 0   Sub Main()      Dim serialFor As Action = Sub()                                   Console.WriteLine(New String(vbCrLf & "[" & Now & "]  Serial Operation..."))                                   For Number As UInteger = 2 To UInteger.MaxValue Step 1                                      For Div As UInteger = 1 To Number - 1 Step 1                                         If Number Mod Div = 0 Then                                            Sum = Sum + Div                                         End If                                      Next Div                                      If Sum = Number Then Console.WriteLine(Number & Space(3) & "Time=" & TimeOfDay)                                      Sum = 0                                   Next Number                                End Sub      Dim parallelFor As Action = Sub()                                     Console.WriteLine(New String(vbCrLf & "[" & Now & "]  Parallel Operation..."))                                     Parallel.For(2, UInteger.MaxValue + 1, _                                             Sub(index)                                                Parallel.For(1, index, Sub(s_index)                                                                          If index Mod s_index = 0 Then                                                                             Sum = Sum + s_index                                                                          End If                                                                       End Sub)                                                If Sum = index Then Console.WriteLine(index & Space(3) & "Time=" & TimeOfDay)                                                Sum = 0                                             End Sub)                                  End Sub      Console.WriteLine(New String("找完數" & vbCrLf))      Console.Write(New String("請選擇執行操作的方式 ( 0=並行計算,1=串列計算 ):"))      Dim readChar As Char = ChrW(Console.Read)      If readChar = "0" Then         Task.Factory.StartNew(parallelFor).Wait()      ElseIf readChar = "1" Then         Task.Factory.StartNew(serialFor).Wait()      Else         Console.WriteLine(New String(vbCrLf & "選擇錯誤,默認將執行串列操作!!!"))         Task.Factory.StartNew(serialFor).Wait()      End If   End SubEnd Module

相關詞條

熱門詞條

聯絡我們