【高性能並行計算】——第三課 矩陣乘並行cannon算法


基本並行實現的討論:

 

正如前面所講的,矩陣相乘過程中,結果矩陣C中的每個元素都是可以獨立計算的,即彼此之間並無依賴性。所以如果采用更多的處理器,將會顯著地提高矩陣相乘的計算效率。

 

對於大小為n × n 的矩陣,加入我們有n個處理器,那么結果矩陣中的每一行,都可以用一個處理器來負責計算。此時,總共的並行計算步數為 O(n^2)。你可以理解為在串行實現的代碼中,最外層的循環 for(i=0;i<n;i++) 被分別由n個處理器來並行的執行,而每個處理需要完成的任務僅僅是內部的兩層循環。

 

如果采用n^2個處理器,那么就相當於結果矩陣中的每個元素都由一個處理器來負責計算。此時,總共的並行計算步數為 O(n)。你可以理解為在串行實現的代碼中,最外面的兩層循環 被分解到n^2個處理器來並行的執行,而每個處理需要完成的任務僅僅是內部的一層循環,即for(k=0;k<n;k++)。

 

更進一步,如果有n^3個處理器,那么即使最內層的循環for(k=0;k<n;k++)也有n個處理器在並行的負責。但是最終的求和運算,我們需要一個類似reduction的操作,因此最終的計算復雜度就是O(log n)。

 

當然,你一定會想到的是,實際中,通常並不可能有像矩陣元素那么多的處理器資源。這時我們該怎么做。對於一個大小為n × n 的大矩陣A,我們其實可以把它切分成s^2個子矩陣Ap,q,每個子矩陣的大小為 m × m,其中 m = n / s,即0 <= p, q < s。對於兩個大矩陣A和B,現在我們有:

傳統矩陣分塊並行乘法的基本思路:   

把大的矩陣划分成小的矩陣塊,比如n=6,有4個處理器(p=4),則把A和B矩陣均划分成由3x3的矩陣快組成的2x2的矩陣,如圖所示:

 

存儲:

  P1處理器存儲A00,B00;P2處理器存儲A01,B01;P3處理器存儲A10,B10;P4處理器存儲A11,B11;
計算:
  4個處理器分別計算C00,C01,C10,C11,由於C00=A00xB00+A01xB10,而P1處理器中只有A00和B00,所以A01和B10就需要從其他線程中傳遞過來,最終完成C00的計算。
缺點:
  最終每個線程中都存儲一行A和一列B(矩陣塊),如P1中存儲有A00,A01和B00,B10。於是大大增加了存儲量,存儲量由O(n平方)—>O(n立方)
cannon算法的目標就是減少分塊矩陣乘法的存儲量 

Cannon算法

 

 

 

下面是矩陣位移的一個示例,;

 

 參考資料:

 https://blog.csdn.net/baimafujinji/article/details/48751037

https://blog.csdn.net/u013720726/article/details/70667697


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM