2014-04-10 81 views
0

我有以下僞代碼(一個循環),我試圖通過使用Matlab並行計算工具箱或Matlab分佈式服務器計算來實現它(可變步長實現)。實際上,我在這個循環中有一個matlab代碼,可以在普通的matlab 2013a中工作。我應該使用並行計算工具箱還是Matlab分佈式計算服務器?

給定:U0,T_0,T(初始和結束時間值)時,初始步長:H0

while t_0 < T 

% the fist step is to compute U1, U2 which depend on t_0 and some known parameters 

U1(t_0, h0, u0, parameters) 

U2(t_0, h0, u0, parameters) 

% so U1 and U2 are independent, which can be computed in parallel using Matlab 

% the next step is to compute U3, U4, U5, U6 which depends on t_0, U1, U2, and known parameters 

U3(t_0, h0, u0, U1, U2, parameters) 

U4(t_0, h0, u0, U1, U2, parameters) 

U5(t_0, h0, u0, U1, U2, parameters) 

U6(t_0, h0, u0, U1, U2, parameters) 

% so U3, U4, U5, U6 are independent, which can be also computed in parallel using Matlab 

%finally, compute U7 and U8 which depend on U1,U2,..,U6 

U7(t0, u0,h0, U1,U2,U3,U4,U5,U6) 

U8(t0, u0,h0,U1,U2,U3,U4,U5,U6) 

% so U7 and U8 are also independent, and we can compute them in parallel as well. 

%做步長控制這裏,然後分配H0:= h_new
T0 = t0時+ h_new

end 

你能否建議我使用Matlab並行實現上述代碼的最佳方式? 通過最好的方式,我的意思是我希望儘可能快地完成整個計算。我有一個訪問超級計算機LEO III,它有162個計算機節點(總共有1944個核心),因此每個節點有12個核心。)

我的想法是計算U1,U2在兩個獨立的工人)同時擁有自己的記憶。使用U1,U2得到的結果,可以對U3,U4,U5,U6進行相似的計算,最後對U7,U8進行計算。爲此,我想我需要在Matlabpool中使用PARFOR?但我不知道循環需要多少個索引(對應於內核/處理器的數量)。

我的問題是:

  1. 我可以使用超級計算機如上所述,這樣我就可以使用MATLAB分佈式計算服務器?

  2. 對於此代碼,我應該使用並行計算工具箱還是Matlab分佈式計算服務器? 我的意思是並行計算工具箱(本地工人),我不能指定哪些工作人員將計算U1和U2(也用於U3,U4,...),因爲他們共享內存並以交互方式運行,是不是?

  3. 如果我使用提議的想法,那麼我需要多少工人?大概8個核心? 這是更好的使用1個計算節點,並要求9個核心(8使用,一個用於matlab會話)或使用8個計算機節點?

我是初學Matlab並行計算。請給出你的建議! 謝謝!

彼得

+0

做T循環的任何迭代取決於過去的迭代? – Jonas

+0

不,它不是! T循環(while循環你的意思)僅僅是從t_0(初始)到T(結束時間)的積分時間。 – user3517471

回答

0

我建議並行while循環,因爲你想要的節點間分配多次迭代。 Parfor是開始進行並行計算的最簡單方法,並且可以很好地解決與您一樣的簡單問題。如果有很多時間步驟需要花費大量時間,那麼只能使用服務器,因爲任何並行化都會帶來一定的開銷。

本地計算允許您在最近版本的Matlab中使用12個內核;確保你有足夠的內存來保存你的循環體的13個副本。由於具有良好的處理器架構,並且沒有其他程序競爭資源,因此可以在所有內核上運行。

這樣:

timeSteps = t0:h:T; 

parfor timeIdx = 1:length(timeSteps) 
    t0 = timeSteps(timeIdx); 

    %# calculate all your u's here 

    %# collect the output 
    result{timeIdx,1} = U7; 
    result{timeIdx,2} = U8; 

end 
+0

感謝您的回答!對不起,但我想要做可變步長實現。這意味着步長h變化,它通過步長控制來選擇。我修改了上面的代碼。請看看它。我想我只是想平行階段U1,U2,然後是U3,..,U6,最後是U7,U8。 – user3517471

+0

@ user3517471 U1等的計算需要多長時間? – Jonas

+0

由於人物的限制,我回答你的問題作爲上面的答案。請看一看。 – user3517471

0

我想說U1的所有計算,.. U8需要調用計算矩陣向量乘法的功能。假設我們不在意他們現在需要多長時間(在我的情況下並不多)。問題是,對於前面的方法,U1,...,U8不是獨立的(它們是依賴的!)。這意味着要計算U_ {i + 1}你需要U_ {i}。所以你需要依次計算它們。現在我可以構建這樣一種方法,允許同時(獨立)計算U1,U2,對於U3,...,U6以及U7,U8也是如此。所以我想保存整個計算的CPU時間。那爲什麼我認爲可以使用matlab並行計算。