大資料平行計算利器之MPI/OpenMP

佔利軍發表於2015-08-06

1 背景

影象連通域標記演算法是從一幅柵格影象(通常為二值影象)中,將互相鄰接(4鄰接或8鄰接)的具有非背景值的畫素集合提取出來,為不同的連通域填入數字標記,並且統計連通域的數目。通過對柵格影象中進行連通域標記,可用於靜態地分析各連通域斑塊的分佈,或動態地分析這些斑塊隨時間的集聚或離散,是影象處理非常基礎的演算法。目前常用的連通域標記演算法有1)掃描法(二次掃描法、單向反覆掃描法等)、2)線標記法、3)區域增長法。二次掃描法由於簡單通用而被廣泛使用!

圖1 連通域標記示意圖

隨著所要處理的資料量越來越大,使用傳統的序列計算技術的連通域標記演算法執行時間過長,難以滿足實際應用的效率需求。隨著平行計算技術的發展,利用不同的程式設計模型,許多資料密集型的計算任務可以被同時分配給單機多核或多機多處理器進行並行處理,從而有可能大幅度縮減計算時間。目前在叢集計算領域廣泛使用MPI來進行並行化,在單機領域廣泛使用OpenMP進行化,本文針對基於等價對的二值影象連通域標記演算法的進行了並行化設計,利用不同的並行程式設計模型分別實現了不同的並行演算法,並通過實驗對利用不同並行程式設計模型所實現的連通域標記演算法進行了效能對比分析。

2 二次掃描序列演算法思想

顧名思義,二次掃描序列演算法步驟包含兩部分。

2.1 第一次掃描

a)標記

b)等價關係建立

2.2 第二次掃描

利用並查集連結串列進行標記更新。

3 並行化策略

3.1 資料劃分並行策略

二次掃描的序列演算法中,非直接相鄰的各像後設資料之間是無關的,將影象分割為資料塊後,對於各個資料塊之間的主體運算也是獨立無關的,可並行性較高,因此可通過對影象進行分塊來加快計算時間、提高計算效率。

3.2 並行演算法步驟

a)各個程式分別使用序列演算法計算

b)各個程式將各塊的標記值唯一化

c)生成等價對陣列

d)主程式生成全域性並查集連結串列

將1到n-1程式中比較獲得的等價對陣列統一傳送給0程式,0程式生成並查集連結串列。

e)廣播全域性並查集連結串列,各程式更改標記值

主程式廣播全域性並查集連結串列,各程式接收後更新標記值。

4 程式實現

並行演算法詳細流程圖。

MPI版本和OpenMP版本的並行演算法。

5 測試準備

5.1 實驗目的

a)正確性
b)效率:測試不同連通域數目的資料、不同機器環境(單機和叢集)、不同並行程式設計模型(MPI和OpenMP)對二次掃描並行演算法效率的影響。

5.2 測試環境

a)單節點
CPU:兩顆Intel(R) Quad Core E5645 Xeon(R) CPU,共12核;

記憶體:80GB ;作業系統:Linux CentOS 64位。
b)高效能叢集(4個計算節點,1個儲存節點)
CPU:兩顆Intel(R) Quad Core E5645 Xeon(R) CPU,共12核;

記憶體:32GB;作業系統:Linux CentOS 64位;

節點間檔案系統:Network File System (NFS)。
c)測試資料
兩個相同資料量( 18640×22260 )的二值柵格影象,一個連通域為3個(簡單圖),一個連通域為10433個(複雜圖)

6  效率測試結果

6.1 結果1:複雜圖和簡單圖的執行時間

6.2 為什麼複雜圖計算時間更長?

6.3 結果2:單節點環境下,複雜圖和簡單圖的加速比

6.4 問題1:為什麼會出現超線性加速比?

原因:並查集連結串列的影響。

連通域標記演算法很多時間用於對並查集連結串列進行大量查詢和插入操作。

6.5 問題2:為什麼複雜圖比簡單圖加速比高?

6.6 結果3:叢集環境下,複雜圖和簡單圖的加速比

6.7 問題:為什麼程式數超過12時,複雜圖加速比不再上升,而簡單圖加速比繼續上升?

6.8 結果4:OpenMP版本與MPI版本的比較?

6.9問題:為什麼MPI 1個程式比OpenMP 1個執行緒更高效?

6.10 OpenMP開闢執行緒的開銷?

6.11 OpenMP編譯製導語句會影響編譯結果?

OpenMP編譯製導語句會影響編譯結果,這也可以解釋單執行緒OpenMP程式比序列程式慢這一現象。

參考文獻

連通域標記演算法的並行化研究,馬益杭、佔利軍、謝傳節、秦承志,《地理與地理資訊科學》

附錄

GPU:平行計算利器

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

大資料平行計算利器之MPI/OpenMP

相關文章