大數據集群計算利器之MPI/OpenMP
---以連通域標記算法並行化為例
1 背景
圖像連通域標記算法是從一幅柵格圖像(通常為二值圖像)中,將互相鄰接(4鄰接或8鄰接)的具有非背景值的像素集合提取出來,為不同的連通域填入數字標記,並且統計連通域的數目。通過對柵格圖像中進行連通域標記,可用於靜態地分析各連通域斑塊的分布,或動態地分析這些斑塊隨時間的集聚或離散,是圖像處理非常基礎的算法。目前常用的連通域標記算法有1)掃描法(二次掃描法、單向反復掃描法等)、2)線標記法、3)區域增長法。二次掃描法由於簡單通用而被廣泛使用!
圖1 連通域標記示意圖
隨着所要處理的數據量越來越大,使用傳統的串行計算技術的連通域標記算法運行時間過長,難以滿足實際應用的效率需求。隨着並行計算技術的發展,利用不同的編程模型,許多數據密集型的計算任務可以被同時分配給單機多核或多機多處理器進行並行處理,從而有可能大幅度縮減計算時間。目前在集群計算領域廣泛使用MPI來進行並行化,在單機領域廣泛使用OpenMP進行化,本文針對基於等價對的二值圖像連通域標記算法的進行了並行化設計,利用不同的並行編程模型分別實現了不同的並行算法,並通過實驗對利用不同並行編程模型所實現的連通域標記算法進行了性能對比分析。
2 二次掃描串行算法思想
顧名思義,二次掃描串行算法步驟包含兩部分。
2.1 第一次掃描
a)標記
b)等價關系建立
2.2 第二次掃描
利用並查集鏈表進行標記更新。
3 並行化策略
3.1 數據划分並行策略
二次掃描的串行算法中,非直接相鄰的各像元數據之間是無關的,將圖像分割為數據塊后,對於各個數據塊之間的主體運算也是獨立無關的,可並行性較高,因此可通過對圖像進行分塊來加快計算時間、提高計算效率。

3.2 並行算法步驟
a)各個進程分別使用串行算法計算
b)各個進程將各塊的標記值唯一化

將1到n-1進程中比較獲得的等價對數組統一發送給0進程,0進程生成並查集鏈表。
e)廣播全局並查集鏈表,各進程更改標記值
主進程廣播全局並查集鏈表,各進程接收后更新標記值。
4 程序實現
並行算法詳細流程圖。
MPI版本和OpenMP版本的並行算法。
5 測試准備
5.1 實驗目的
5.2 測試環境
CPU:兩顆Intel(R) Quad Core E5645 Xeon(R) CPU,共12核;
內存:80GB ;操作系統:Linux CentOS 64位。
CPU:兩顆Intel(R) Quad Core E5645 Xeon(R) CPU,共12核;
內存:32GB;操作系統:Linux CentOS 64位;
節點間文件系統:Network File System (NFS)。
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程序比串行程序慢這一現象。
參考文獻
連通域標記算法的並行化研究,馬益杭、占利軍、謝傳節、秦承志,《地理與地理信息科學》