2014-01-30 123 views
0

我正在使用parfor在matlab中並行化一個循環。代碼如下:在matlab中使用parfor時出錯

parfor i = 1:15 

    tmp{i,1} = theta(i) * Fw{i,1}' * var1 * Wi{i,1} * var2 * Fw{i,1} ; 

    end 

FW,Wi是包含矩陣的單元。 var1,var2是矩陣。 Theta是一個矢量。

當我執行此代碼matlab永遠掛起,經過很長時間,當我終止代碼它顯示以下錯誤。

警告:評估偵聽器回調時發生錯誤。使用主要(線58)

在主在58 錯誤:使用distcomp.remoteparfor/getCompleteIntervals

錯誤當我執行而不PARFOR代碼,它工作正常。下面

Fw = cell(15,1); 

Wi = cell(15,1); 

tmp = cell(15,1); 

for i = 1 : 15 
    Fw{i,1} = randn(25344); 
    Wi{i,1} = randn(12672); 
    theta(i) = 10; 
end 

var1 = randn(25344,12672); 
var2 = randn(12672,25344); 
parfor i = 1:15 

    tmp{i,1} = theta(i) * Fw{i,1}' * var1 * Wi{i,1} * var2 * Fw{i,1} ; 

end 
+0

該方法是我期望您的客戶阻止等待結果從工人回來的地方。你有我們可以嘗試的再生產步驟嗎?你正在運行什麼版本的MATLAB?您使用的是什麼羣集類型?你打開了多大的matlabpool? – Edric

+0

我使用的matlab版本是8.2.0.701(R2013b)。 Matlabpool包含12名工作人員 – gopi

+0

好的。你有沒有可以嘗試的複製品? – Edric

回答

1

PARFOR

的完整代碼被給予被設計成在一臺計算機上操作兩者,並且跨機器的羣集,和工作進程不共享一個地址空間。因此必須將所有數據複製到工作人員。就你而言,你正在將大量數據複製到12名工作人員中。我強烈懷疑您觀察到的問題是由於數據傳輸的開銷,以及每個工作人員需要存儲自己的var1var2副本。

我會嘗試:從數組的大小開始,並檢查事情的工作。隨着您逐漸增加尺寸,當機器內存不足時,您可能會發現事情開始出錯的地步。

這可能有助於將var1var2存儲在sharedmatrix中。

+0

我正在使用192gb ram的集羣 – gopi

+0

'var1' +'var2'是5GB - 每個(主機+12個工作人員)有13個副本,即65GB。不幸的是,在傳輸過程中會創建額外的副本,並且還會傳輸「Fw」和「Wi」元素。你是否嘗試縮小尺寸? – Edric

+0

它適用於小尺寸的基體。有沒有反正如何使它適用於大型矩陣 – gopi