第三章 平行化程式開發及運算平台
3.1 地下水量規劃管理模式平行化
第三章 平行化程式開發及運算平台
整個地下水量即時管理模式中,計算量集中於 2.2 節之地下水量規劃模式,
其是以遺傳演算法為優選之主體架構,每條染色體代表容量擴張型態之抽水與監 測井網,且在每條染色體給定下,以退火演算法進行時變抽水量優選。然而利用 遺傳演算法及退火演算法處理時變問題,將會產生計算量的問題。因此本研究利 用遺傳演算法本身隱平行之特性,以分配染色體為計算量切割,在平行電腦大量 計算資源下,克服所需大量計算。
3.1 地下水量規劃管理模式平行化
一般而言循序程式平行化之好壞,除了取決於循序程式的演算流程及特性 外,亦與所使用之平行電腦有關,平行運算詳細說明請參照附錄 F。在此節中,
將針對平行運算與地下水規劃管理模式之結合做一說明,其平行化之步驟如下:
1.平行化架構規劃
由圖 3.1-1 之為地下水規劃管理模式之程式流程圖,可概括地看出,整個模 式分成三個主要部分,即資料的讀取、染色體迭代計算及結果輸出。在資料讀取 方面,此模式須開啟多個資料檔,包含含水層厚度、單位設井成本、各時期之需 水量、抽水量上下限、水位下限…等等。為求資料的一致性,及避免日後平行程 式的維護困難,所有 CPU 皆進行輸入資料檔之讀取,以減少 CPU 間之訊息傳遞。
而在產生染色體方面,選擇將編號為 0 的 CPU 來進行染色體之複製、交配、突 變,再利用集體通訊副程式將產生之整個族群染色體廣播(Broadcast)給各個 CPU。Broadcast 的用法如下:
CALL MPI_BCAST(DATA,ICONT,DATA_TYPE ,IROOT, MPI_COMM_WORLD,MPIERROR)
引數 DATA 為要送出去的資料名稱、簡單變數或陣列 ICOUNT 為要送出去的資料數量
DATA_TYPE 為要送出去的資料類別
IROOT 為要送出去的 CPU 代號
MPI_COMM_WORLD MPI 內定的 (default) communicator,參與該 程式平行計算的全部 CPU 都是屬於同一個 communicator。屬於同一個 communicator 的 各個 CPU 之間才可以傳送資料。
MPIERROR 為 MPI 引數,平行程式發生錯誤時輸出錯誤訊息。
開始
(3)由SA求出每條染色體 最佳之時變抽水量及其操作成本
(4)計算各染色體之總成本 (目標函數)
(5)計算各染色體之適合度
(6)是否滿足收斂條件
求得最佳佈井方 案及抽水策略
END 是
(7) 複製 交配 突變
否
結果輸出 疊代計算 資料輸入
含水層厚度 設井成本 各時刻之需水量 抽水量上下限 水位下限 (1)隨機產生多條染色體
(容量擴張設井方案)
(2)是否滿足最少的設 井數
是 否
加入一處罰函數 使其總成本為一
個很大的值
圖 3.1-1 地下水量規劃管理模式之程式流程圖
各顆 CPU 接收到從 CPU 0 傳來的各種參數後,即可進行子族群之同步運 算,最後各子族群再將運算結果傳回給 CPU 0,由 CPU 0 做輸出的動作,如此 完成平行化的動作。
2.MODFLOW 2000 之 I/O 方式修改
本研究以嵌入法(Embedding method)由 MODFLOW 2000 計算水位與計算水 位及敏感度矩陣。但 MODFLOW 2000 以 ASCII 檔案方式作為資料之輸入/輸出 方式,當各 CPU 計算而每條染色體適合度,皆會呼叫 MODFLOW 2000 進行計 算,也就是,各 CPU 同時且非常頻繁地讀取及寫入 MODFLOW 2000 輸入/輸出 檔案,雖然平行電腦之檔案系統允許多 CPU 同時讀取相同檔案,但無法同時寫 入相同檔案,且當多 CPU 對檔案系統頻繁地讀取及寫入 ASCII 檔案,會造成檔 案系統負荷過重,降低平行運算效能。
因 此 , 為 克 服 上 述 之 平 行 電 腦 檔 案 系 統 負 荷 過 重 問 題 , 本 研 究 修 改 MODFLOW 2000 之 I/O 方式,以存取記憶體作為 MODFLOW 2000 輸入/輸出方 式。使各 CPU 在平行運算過程中,降低檔案系統負荷,增加平行運算效能,但 需對修改後之 MODFLOW 2000 程式碼進行驗證,以確保其計算結果與原始之 MODFLOW 2000 相同。
3.循序程式之微調
一般而言,若循序程式本身有良好的結構(Structure)及性能表現(Absolute Performance),則其平行處理過程將會變得較容易且獲得較高之平行效率。由於 Fortran 語言採用的記憶體配置方式為 Column wise,也就是第一維 Index 變動得 最快而最後一維變動得最慢的順序,因此,將循序程式中的巢式迴圈(Nested loop) 做了適當的調整,亦即將陣列最後一維的迴圈指標改置在最外迴圈。如以下所表 示:
原本迴圈結構為 DO I=1,M DO J=1,N
H(I,J)=計算部份
ENDDO
5.資料整合處理
在遺傳演算法中雖然每條染色體是彼此獨立之個體,可是在一代內全部的染 色體計算完畢後,仍然要做適合度排序、複製、交配、突變的工作,如此一來則 必須將各個染色體的適合度傳回 CPU0 以進行前述的工作,其適合度傳送之副程 式用法如下:
(1)由代號不為 0 的 CPU 傳送
CALL MPI_SEND(OBJ_V(ISTART),KOUNT, DATA_TYPE,IDEST, ITAG,MPI_COMM_WORLD,MPI_ERR)
引數 OBJ_V(ISTART) 為要送出去的陣列起點 KOUNT 為要送出去的資料數量 DATA_TYPE 為要送出去的資料類別
IDEST 為接收之 CPU 代號(在這裡為 0) ITAG 為要送出去的資料標籤
(2)由代號為 0 的 CPU 接收
CALL MPI_RECV(OBJ_V(ISTART1),KOUNT1, DATA_TYPE,ISRC, ITAG,MPI_COMM_WORLD,MPI_ERR)
引數 OBJ_V(ISTART) 為要接收的陣列起點 KOUNT1 為要接收的資料數量 DATA_TYPE 為要送出去的資料類別
IDEST 為傳送之 CPU 代號 ITAG 為要送出去的資料標籤
6.平行程式之完成
經由上述之步驟 1 至步驟 5,我們確定了 I/O 之處理、切割方式以及傳送適
合度資料後,即可將循序程式進行切割、加入平行副程式語法(Parallel Routine),
以完成平行化之地下水量規劃管理模式。
圖 3.1-3 所示為此地下水量規劃管理模式之平行化程式架構圖,由此圖 可看出,在平行處理過程中,採用計算切割而資料不切割方式,亦即利用迴圈 (Loop)上不同指標執行不同區段的方法來完成子族群之計算,而計算所須之資料 則經由 CPU 0 傳送給各 CPU。資料不切割的平行程式好處在於其陣列的描述與 循序程式完全相同,程式容易閱讀也容易維護,反之,資料切割的平行程式雖可 節省記憶體的用量,但陣列描述方式與循序程式差異很大,程式不易閱讀,由於 現在的機器的記憶體都非常大,因此在平行化時,選擇計算切割而資料不切割是 較好之抉擇。
CPU 0
Input Data
含水層厚度
Input Data
含水層厚度
Input Data
含水層厚度