3. 一個簡單的例子

  1. 例題和演算法

    我們以求 N 個整數中的最大值為例來探討前述的觀念,平行處理這個 問題的方式是把資料等分成 M 份,分別交給 M 個 cpu 求出每一份的 最大值,再由另一個程式合併找出 M 個最大值中最大的一個得到答案 。所以這個演算法共需要 M+1 個 cpu ,在過程中這 M 個 cpu 會傳送 資料給另一個 cpu ,如下圖:

  2. 實作工具

    我們用三個不同的方法來達到上面的三個要素:由佇列式分散處理系統 CODINE (註)負責 Processor Allocation , NFS 作為 Message Passing 的媒介 , 而由程式本身來控制工作進度的同步。
    1. CODINE -- 處理機(Processor)的分配

      CODINE 是一個將工作分散到不同 UNIX 主機的系統,工作必須寫在一個 shell script 中, CODINE 會自行選擇一部負荷最輕的主機來執行它。如此可以平衡各主機的負荷而獲得最佳的效率。除此之外,它可自然達到 scalability 的要求,即使實際可用的主機數少於程式所需的數目,依然能將較多的工作交給負荷較輕的主機以多工的方式同時進行。
    2. NFS -- 訊息的傳遞


      NFS (Network File System) 是目前通用於大多數 UNIX 系統上的檔案共享方式,它可以讓使用者透過網路直接存取遠端主機的檔案系統,有如使用自己的擋案系統一樣。所以藉由 NFS 存取同一個檔案系統,就能完成 message passing 的功能。
    3. 程式本身 -- 工作進度的同步

      由於工作的同步直接影響到程式的執行過程,不容易找到一個系統來提供這項功能,所以在這裡我們用程式本身重覆檢查檔案存在與否來完成這個任務。
  3. 程式實作說明

    這個程式分成幾個部份,包括一個 Bourne shell program 透過 CODINE 將所有子工作交由不同電腦執行、二個 CODINE scripts 描述子工作的內容(包括計算的進行和結果的合併)、 和一個 C 程式作真正的計算工作。(在下面的實作中 N=10000, M=4)
    以下我們依照這組程式的結構分三小節說明之:
    1. 主程式

      這個主程式只負責啟始整個系統,包括二件事情 --- 清除必要的檔案和起動各程序平行工作。
           # Shell program: max
      
           刪除用作程序間通訊管道的檔案 result*
      
           for i in 0 1 2 3 
           do
             向 CODINE 要求一個 cpu 作第 i 個子工作
           done
           向 CODINE 要求一個 cpu 作收集結果和合併的工作
      
    2. CODINE 程式

      雖然真正進行平行計算的程式是下一小節的 max.c ,但由於 CODINE 和主機間必須藉由 shell script 才能告訴它要做的工作,所以 max-script 主要只是去執行 max.exe (max.c 編譯後的可執行檔 ) ,並將結果存入特定檔案用以傳送到其它程序。
          # CODINE Script: max-script
      
          呼叫 max.exe 處理第 i 部分資料並將結果存在 result(i) 中
          記錄主機名稱和 i 值
      

      雖然這些程序是在不同主機上執行,但透過 NFS 共用檔案系統,下面的程序 merger 依然可以根據檔案 result(i) 存在與否來判斷它們的工作是否已完成,並藉以獲得它們傳出的資料進行合併。
          # CODINE Script: merger
      
          while(所有程序尚未全部完成)
            暫停 30 秒
          done
          從檔案 result(i) 中取得各程序處理結果合併成最後答案
      
    3. 真正作計算的 C 程式

      max.exe 的原始 C 程式 max.c 計算各部分資料的最大值:
         void main(argc,argv)
         {
           讀入所要處理的是第幾部分的資料
           開啟資料檔
           跳至資料檔中所要處理的部分
           逐個讀入資料並計算最大值
           關閉資料檔
           印出結果
         }
      

(註) CODINE (COmputing in DIstributed Networked Environments) 是一個 Queuing System ,由 GENIAS Software GmbH 公司出品。它由美國國家航太總署(NASA)所發展的NQS 系統延伸而來,但基本功能依然類似,都是接受使用者的請求,代為選擇和分配適合的 UNIX 主機來執行工作。在這裡也不是一定要用 CODINE 才可以,用其它 Queueing Systems (如 NQSDQS) 也能達到同樣的功效。