茍悅宬
(北京交通大學計算機與信息技術學院,北京 100044)
矩陣乘法是線性代數中的基礎運算,也是科學研究、工業生產中很常見的計算。可它往往會因為矩陣規模過大而出現運算時間過長等耗費時間的現象,在現實用于生產時,顯然無法承受性能低下帶來的經濟損失。
基于集群計算機的并行算法主要有MPI 和OpenMP 兩種[1]。其中,MPI是一種消息傳遞編程模式,其實現關鍵在于正確地進行消息傳遞,它的編程模式復雜,需要分析和合理地劃分計算程序[1]。OpenMP是一套用于共享內存并行系統多線程程序設計的指導性注釋(compiler directive),是為共享內存的多處理器系統設計的并行編程方法,OpenMP 特別適合用在多核處理器計算機上運行的并行程序設計[2]。MPI+OpenMP 混合并行程序執行流程圖如圖1 所示[3]。OpenMP用于每個結點上的計算密集型工作,MPI用于實現結點間的通信和數據共享。在集群內采用MPI技術,減少消息傳遞的次數以提高速度,在集群的每個成員上又采用OpenMP 技術,節省內存的開銷,綜合兩種并行的優勢,可以提升并行程序的執行效率。

圖1 MPI+OpenMP 混合并行程序執行流程圖[3]
關于OpenMP和MPI的一些更具體的對比見表1。

表1 OpenMP和MPI的比較
此外,本實驗在PC 機與華為鯤鵬處理器上完成,鯤鵬920 處理器采用華為自主開發的處理器內核,兼容ARMV8.2 指令集,通過優化分支預測算法、提升運算單元數量、改進內存子系統架構等一系列微架構設計,大幅提高了處理器單核性能[4],且集成了64核,主頻提升至2.6GHz[5]。
本實驗選取兩個1000*1000 的矩陣相乘,在此種規模矩陣的相乘下設計了MPI+OpenMP混合編程的優化方法,采用OpenMP在每個結點計算,使用MPI進行進程間通信。并在PC機、華為鯤鵬服務器上得到了不同線程的運行結果,并給出了性能分析與相關結論。
本實驗取兩個1000*1000 矩陣Matrix_one和Matrix_two進行乘法運算,運用MPI_Scatter 數據分發的思想將Matrix_one分為數個行數為1000除以進程數、列數為1000的小矩陣,并使用MPI_Bcast將Matrix_two廣播至每個進程,在每個MPI 進程中,使用OpenMP 輔助進行小矩陣和Matrix_two的相乘運算。最后再用MPI_Gather聚集運算結果,并顯示時間性能的相關信息。圖2是在進程數為4時的運算流程。

圖2 MPI+OpenMP 混合并行程序執行示意圖
為進行運算首先需要生成兩個矩陣,采用rand()%10 生成每個單元都為10以內的整數的矩陣,代碼如下:

這里矩陣2生成的時候相當于直接將一個矩陣的轉置存入,這是為方便后續運算時兩個矩陣都是每一行對應相乘,讀取是連續的,速度較快。
此處實現將矩陣1 分塊并將矩陣2 廣播給各線程的工作,做好并行計算的準備。代碼如下:

矩陣1 分成的小矩陣和矩陣2 相乘采用OpenMP 執行,實現代碼如下,注意此處ii和kk兩個局部變量需要在線程內部定義,否則會出現多線程使用同一變量的局面,造成運行失敗。代碼如下:

此外,對于不能整除的情況,即分割過程中矩陣1剩余的行,直接在線程0中計算即可,過程與上述類似。
使用MPI_Gather 匯聚計算結果,如有需要,也可以將結果矩陣輸出至文件觀察。匯聚結果的代碼如下:
MPI_Gather(local_result, local_M * N, MPI_INT, result_Matrix,local_M*N,MPI_INT,0,MPI_COMM_WORLD);
首先進行PC機的測試,所用PC機具有8核CPU,分別分配1/2/4/8個進程,所得運行時間如表2。

表2 PC機測試結果
單個華為鯤鵬處理器的運行結果如表3,分別在進程數為1/2/4/8/16/32的情況下進行。

表3 鯤鵬處理器(單機)測試結果
多機運行結果為表4,其分配的線程數量與單機一致。

表4 鯤鵬處理器(多機)測試結果
PC 機運行結果折線圖如圖3,可見在一般的8 核CPU中,1000*1000 規模的矩陣乘法運算速度隨著進程數提高而顯著加快。

圖3 PC機結果折線圖
鯤鵬處理器的運行結果折線圖如圖4,可見鯤鵬處理器的性能比一般PC 機CPU 高很多,但是這里出現的情況是運行時間隨著進程數的增加、處理器數量的增加而增加。由此可見并不是進程數越多運算就越快,還涉及進程通信的時間損耗、硬件資源的環境限制、問題的規模大小等諸多因素。

圖4 鯤鵬處理器結果折線圖
本實驗完成了規模選取、算法設計、代碼編寫與調試、結果性能分析的完整過程,得出了運算速度不是單純地取決于進程數量的結論,這與人們一般的思維方式是不同的,進程通信、服務器交互過程中發生的時間損耗、所用不同硬件環境的資源限制、欲解決問題的規模大小等許多的因素都會影響到運算時間的長短。工業生產等諸多領域都會用到此并行編程模型,對于影響運行性能的要素需要格外注意。