複製鏈接
請複製以下鏈接發送給好友

加速

(計算機並行應用程序設計術語)

鎖定
加速(Speedup)是在多核機器上運行應用程序(相比單核機器)所能夠預期的性能收益。
中文名
加速
外文名
Speedup
適用範圍
多核心或者多個硬件線程的CPU
適用領域
計算機並行編程

加速定義

測量加速時,單核機器的性能為基線。例如,假設一個應用程序在單核機器上的持續時間是六小時,那麼該應用程序在一個四核機器上運行時,持續時間減少到三個小時。換句話説,應用程序快了兩倍。
你可能會認為在單核機器上運行的應用程序在雙核機器上運行時會快兩倍,在四核機器上運行時會快四倍。但是,這並不完全正確。除了一些特例,比如超線性加速,即使整個應用程序都並行運行,線性加速也是不可能。這是因為總有一些並行應用程序的開銷,比如將線程調度到單獨的處理器。因此,線性加速是不可能實現的。
並行代碼線性加速具有以下限制:
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是來自並行的開銷。 [1] 

加速程序示例

下面的程序代碼是用來測試並行代碼的執行效率的,代碼語言:Visual Basic.NET(.NET Framework 4.0)。
Imports System.Threading.Tasks
Module 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 Sub
End Module
參考資料
  • 1.    Donis Marshall(美).Visual Studio 2010並行編程從入門到精通:清華大學出版社,2013年1月第一版