• 沒有找到結果。

地下水量規劃管理模式平行化

第三章 平行化程式開發及運算平台

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

含水層厚度

相關文件