2013-04-17 59 views
1

我想在Matlab中並行運行矩陣乘法的代碼。我已經爲它編寫了順序代碼。我已經使用'spmd'方法並行運行它。但是,並行代碼的執行時間多於順序代碼。我的座右銘是減少並行運行代碼的執行時間。 我不想使用內置函數進行乘法運算,因爲我想要移除for循環中的依賴項並運行它。我該怎麼做?? 我曾嘗試休耕代碼.. 請幫我..matlab中矩陣乘法的並行代碼

a=[1,2,3,4;5,6,7,0;8,9,10,11;12,13,14,15]; 
b=[1,2,3,4;5,6,7,0;8,9,10,11;12,13,14,15]; 
warning off all;  
%Sequential code 
tic 
    for i=1:4 
    for j=1:4 
     sum=0; 
     for k=1:4 
      sum=sum+(a(i,k)*b(k,j)); 
     c(i,j)=sum; 
     end; 
    end; 
    end; 
    time1 =toc 

    %parallel code 
    matlabpool('open'); 
tic 
spmd 
for i=1:4 
    for j=1:4 
     sum=0; 
     for k=1:4 
      sum=sum+(a(i,k)*b(k,j)); 
     c(i,j)=sum; 
     end; 
    end; 
    end; 
end; 
time2 =toc 

我得到的輸出是..時間1的序貫和時間2並行

矩陣

time1 = 

0.0041 

Starting matlabpool using the 'local' profile ... connected to 2 labs. 

time2 = 

0.6950 

>> 
+0

嘗試在spmd之後放置抽屜 –

+0

對於這樣一個簡單的例子,您不太可能看到任何改進:您應該嘗試將'a'和'b'設置爲例如'10000x10000'矩陣。然而,這仍然最有可能是平行的慢 - 支持MATLAB的BLAS算法非常快。順便說一句,你這樣做的理由(我把它解釋爲「從你的問題中刪除依賴關係」)是相當不穩定的......並行計算工具箱的依賴關係比簡單矩陣乘法更多。 – wakjah

+0

我嘗試了在SPMD之後放置抽搐,它力量工作 – user1916616

回答

1

擴展評論而不是一個答案:

  • 您的測試矩陣非常小;任何可能的加速執行都會被啓動並行執行池的開銷所淹沒;
  • 你似乎沒有初始化你的輸出矩陣c;已知代碼建議動態創建矩陣比更新以前創建的矩陣慢得多。首先嚐試c = zeros(grows,ncols)
  • 我相信Matlab的最新版本會自動進行多線程直接矩陣乘法,您將面臨一個真正的挑戰,試圖編寫一個與自己的速度原生方法相匹配的函數。
+0

正確 - 使用SPMD塊(在單個機器上)的顯式並行處理永遠不會超過MATLAB的隱式多線程(也不應該)。 – Edric

+0

我的座右銘是並行運行ART順序算法,以並行處理開始,我只是使用矩陣乘法。所以我想了解如何刪除for循環中的依賴關係。 – user1916616