#發行日期:1986、10 #期號:0202 #專欄: #標題:平行處理的計算方法 #作者:陳俊良 唐傳義 李 家同
|
|
平行處理的計算方法 【摘要】平行處理不只要有足夠多的處理單元;更重要的是要有好的平行計算方法…… 很多人以為平行處理(parallel processing)只要有足夠多的處理單元(processing unit)就可以解決一切問題,因此只在硬體技術的發展上投資大量的金錢和人力。其實,更重要的是平行處理要有好的平行計算方法(parallel algorithm)。如果沒有好的平行計算方法,即使你擁有一百萬個處理單元也是毫無意義的。 讓我們以一個將數字由小到大的排序問題來說明。讀者也許知道在傳統的計算機上,如何處理一千個數字的排序問題。但是,如果給你1,000個處理單元的平行計算機,你該怎麼做呢?是不是反而有英雄無用武之地的感覺呢?事實上,這是因為你不了解排序問題的平行計算方法。 有一種叫做兩兩交換的排序方法(odd-even transposition sort)可以幫助你解決這個問題。讓我們考慮用6個處理器來排6個數目的大小。這六個數分別放在PE(1), PE(2), ……PE(6),排成一線的六個處理單元裡,如圖一所示:而這個排序方法的動作就如圖二:在每個奇數的步驟裡,每個單號的PE(i)和PE(i+1)做比較與交換資料的動作;將較小的放在PE(i),將較大的放在PE(i+1)。而在每個偶數的步驟裡,每個雙號的PE(i)和PE(i+1)做同樣的動作。經過五個步驟之後,排序就完成了。對於任意N個數用N個處理器,可以用上述的方法在N-1個步驟後排好大小。 上面這個方法也稱為“systolic”的計算方法;systolic是心臟收縮的意思。當心臟正常收縮的時候,血液被送到身體的每一個角落,而systolic計算方法在一群處理器上同時運作,每一個處理器就像心臟抽送血液一樣地輸入及輸出資料。 讓我們再看一個矩陣和向量乘法(matrix-vector product)的systolic計算方法來加深印象:對任意一個矩陣 用上面的結構,我們可以在各時間內得到以下的計算結果,而被框起來的那三個就是我們的答案: systolic計算方法並不是唯一的平行計算方法,事實上我們可以靠「各個擊破」(divide-and-conquer)法則導出許多其他的平行計算方法。讓我們來考慮8個數1, 2, 3, 4, 5, 6, 7, 8找最大值的方法: 步驟一:將8個數任意分成兩堆1, 2, 3, 4,5, 6, 7, 8 步驟二:分別求這兩堆數的最大值,其結果分別是4和8 步驟三:對4和8求出較大值8,這就是我們的答案 大家可以看出在步驟二中已經有平行性的存在,即有二組「四個數求最大值」的問題,可以同時而互不干擾地解決。而每一組「四個數求最大值」的問題,又可以靠遞迴(recursive)各個擊破的法則,繼續分解而求解,而最後的答案是由步驟三做合併(merging)而得。 要利用各個擊破法則來導出問題的平行計算方法,最重要的就是了解問題的性質而找出好的合併方法。讓我們考慮8個數:8, 1, 2, 4, 6, 7, 5, 3的排列大小問題,我們以下列的步驟來處理: 步驟一 將這8個數任意分成兩堆 8, 1, 2, 4和 6, 7, 5, 3 步驟二 分別地(互不干擾而同時地)去解決兩個4個數的排列大小問題,我們得到 1, 2, 4, 8 步驟三 將上述兩列中單號的數1,4和3,6合併,雙號的數2,8和5,7合併,這兩件事也可以不相干擾地同時做。於是我們得到 1, 3, 4, 6 步驟四
將雙箭頭所指數對同時兩兩比較交換 以下我們要介紹最近流行的超級計算機(如Cray-1和Cyber 205)的基本工作原理,同時我們也要介紹如何設計適合這種超級計算機的計算方法。 幾乎所有商業上的超級計算機,都用管線原理來設計。假定我們有m個相同的工作要處理,每個工作的處理過程需費時n個時間單位,那麼處理全部m個 工作要花m×n個單位時間。 但是,我們可以將處理過程分成k個階段,每個階段都由一個處理器來執行。那麼,整個處理過程是由一連串的k個處理器來執行,如圖五所示。我們也可以假定這m個工作,是一個接著一個送進這一連串的處理器的。於是,當1號處理器完成第一份工作第一階段的處理後,第二份工作就送進1號處理器,而2號處理器就開始處理第一份工作第二階段,我們以k=3來作示範,整個的過程如圖六所示,在步驟3之後所有的處理器都同時工作著,除了起動時間(start up time)外,每個步驟都有一個工作完成。從時間上來比較,原來需時m×n,現在只需,我們可以說整個過程增快了k倍。當k值慢慢增大時,速度的增快就逐漸顯著了。 超級計算機之所以快,是因為下面二個理由:一、處理器使用高速的元件,每一個動作只需極短的時間單位;二、處理器使用管線原理製作,每一個運算的處理過程都分成了許多階段。 讓我們看一下圖七,這是一個應用管線原理處理指令的典型例子。當抓取一個指令的動作完成後,如果可能的話,處理器會去抓下一個指令(當然,我們要知道下一個指令要到那兒去抓,才能做這件事)。所以讀者應該可以了解,對超級計算機來說,當運算和數據變得有規律和重複時,計算方法就變得相當有效率了。 Cray-1的單位動作時間(clock cycle)是12.5×10-9秒。一個乘法要七個單位動作時間,那麼,在一秒內可執行次乘法,但是如果是向量運算的話它會更快。 假定我們有二個向量x=(x1,x2,…,x64)和y=(y1,y2,…,y64),而且我們想要計算,在這個例子裡,我們可以看到,除了起動時間外,所有的處理器都同時地忙碌著,如圖八所示。從使用者的觀點來看,在穩定的狀態下,每一個單位動作時間都有一個乘法完成,所以在一秒鐘內,執行乘法的數目是 Cray-1裡還有一個加法器(adder)可以和乘法器(multiplier)同時工作,所以Cray-1在一秒鐘內所執行的運算的全部數目是160×106。這也就是為什麼我們叫Cray-1是160Mflops(mega floating point processing per second)的機器了。下面一個例子可以說明即使是超級計算機仍然要有好的計算方法,才能使它有效率地工作。 我們要解決下面的帶狀線性系統(banded linear system)的9階聯立線性方程式的問題:
這個計算方法基本上是消去ai,我們把數據分成三部分,第一步如下所示地消去a1,a4,a7。
第二步,我們消去a2,a5和a8,如下所示
x4=-a3x3+y4 x5=a3a4x3+b5 x6=-a3a4a5x3+b6 x7=-a6x6+y7 x8=a6a7x6+b8 x9=-a6a7a8x6+b9 由此我們可以了解,要用像Cray-1這種超級計算機,仍然必須製作向量化的計算方法,才能提高計算速率。硬體技術一天天地進步,平行處理越來越接近實用的階段。在這篇文章裡,我們不厭其煩地強調計算方法的重要性,無非是希望讀者在驚歎硬體的突飛猛進之餘,更應該想想我們要如何去應用它們。 唐傳義、陳俊良均係交通大學計算機工程研究所博士班畢;李家同任教於清華大學工學院 |
|
科學月刊全文資料庫 最佳瀏覽解析度800*600,請使用IE4.0以上版本的瀏覽器 科學月刊雜誌社.金台灣資訊事業有限公司.圖龍文化事業股份有限公司版權所有 |