2012-06-21 26 views
2

目前我正在開展一個項目,並希望提高執行速度。 我完全不熟悉並行編碼。我的程序最初有6個循環,我管理 將其優化爲三個循環,執行時間減少了300%。從我研究的 我認爲問題在於索引。我在之前的循環中已經使用了parfor,但是索引是i = 1:vs_max-1。如何在Matlab中優化用於並行化的嵌入循環索引?

在下面的代碼:

for i = 1:vs_max-1 
for j = i+1:vs_max-1 
    d = max(abs(X(i,:)-X(j,:))); 
    DD = exp(-(d/r)^n); 
    D(i,j) = DD; 
    D(j,i) = DD; 
    while (i~=vs_max) 
    d2 = max(abs(X2(i,:)-X2(j,:))); 
    DD2 = exp(-(d2/r)^n); 
    D2(i,j) = DD2; 
    D2(j,i) = DD2; 
    break; 
    end 

end 
end 

我相信這個問題是在第二循環的索引,其中j還要求我值 ,當我們有一個以上的線程,我們必須將這些值多址。

任何人都可以幫助我重新編制這個循環,以便parfor不提示或提供其他類型的代碼優化,以便上面的代碼變得更快?

非常感謝您的好意閱讀和回覆我的文章。

回答

2

你基本上是在一個上三角矩陣中生成索引。當i的值朝着vs_max-1前進時,線越來越短。除非正在執行一些動態工作計劃(例如,如果您碰巧熟悉OpenMP,則類似於schedule(dynamic)),否則這不會在多個線程之間良好分配。

您可以將事情「扁平化」並運行一個循環,並使用一些數學將迭代次數轉換爲(i,j)對,例如,有關可能的解決方案,請參見this question。如果您有足夠的內存,也可以使用所有可能的(i,j)對的預填充列表,然後用它從迭代編號快速計算ij

順便說一句:計算的第二部分看起來很奇怪。爲什麼把它放在一個始終執行並且執行一次的while循環中(i ~= vs_max始終爲真,因爲i永遠不會到達vs_maxbreak在第一次迭代後終止)?