如果parfor
認爲計算機沒有足夠的RAM來並行運行代碼,它會自動序列化它嗎?這絕對是這種情況。沒有足夠的內存用於parfor
我有兩個相同的parfor
循環(除了關於它們中矩陣的大小)。第一個很容易達到100%的CPU和一半的RAM,第二個達到12-20%的CPU和所有的RAM,代碼是完全相等的(除了它們中的矩陣的大小)。
如果parfor
認爲計算機沒有足夠的RAM來並行運行代碼,它會自動序列化它嗎?這絕對是這種情況。沒有足夠的內存用於parfor
我有兩個相同的parfor
循環(除了關於它們中矩陣的大小)。第一個很容易達到100%的CPU和一半的RAM,第二個達到12-20%的CPU和所有的RAM,代碼是完全相等的(除了它們中的矩陣的大小)。
我已經解決了這個問題中的相同問題here。
簡而言之,作爲獨立於其他人的Matlab池中的每個工人,每個工人都需要自己的內存量。
否,如果內存不足,Matlab不會自動將for循環序列化。如果Matlab拋出一個適當的錯誤(因爲我知道它發生在Windows PC上),你可以做一些try-catch
聲明。 try-catch
只是試圖執行try
分支中的代碼,如果發生錯誤,它會自動執行catch
塊。在你的情況下,它會像
try
% parfor here
catch
% standard for here
end
你可以做到這一點。我會添加關於嘗試捕獲的想法總體上有多糟糕的信息,因爲它會使代碼方式變慢。 –
「try/catch」的問題是,如果你的代碼在並行處理2小時後耗盡內存,你只是浪費了2個小時的時間去嘗試做一些無法完成的事情。更好的辦法是估計輸出的大小,看看它是否適合整個RAM,然後根據這個決定。 – Adriaan
如果您的代碼足夠短[mcve],請編輯您的問題以包含代碼。根據我的經驗,'parfor'總是會在內存不足時拋出一個簡單的內存不足錯誤,並且不會進入串口。 – Adriaan