2012-01-23 32 views
4

我不能在下面的短腳本中找出問題,它應該比較單個CPU計算和有關計算時間的並行化。在MATLAB中並行化的問題

parfor 鏈接到完整的圖像:LINK

的代碼是:

n = 700; 
ranksSingle = zeros(1,n); 
tic 
for ind = 1:n 
    ranksSingle(ind) = rank(magic(ind)); 
end 
toc 

matlabpool local 4 
tic 
ranks = zeros(1,n); 
parfor (ind = 1:n) 
    ranks(ind) = rank(magic(ind)); 
end 
toc 
isequal(ranksSingle, ranks) 
matlabpool close 

我也matlabpool 2試了一下。從流程窗口中可以清楚地看到,運行並行計算(標記爲紅色)時,所有內核都忙到100%。

當運行單CPU計算(標記爲藍色)時,4核心比以前更加忙碌。我預計只有一個核心會上升。我搜索了互聯網,看看magic()rank函數是否內置並行化,但是您可以從這裏閱讀:http://www.walkingrandomly.com/?p=1894事實並非如此。所以這4個內核並不是很忙,但我仍然想知道爲什麼所有的內核都升級了。其次,我真的不知道並行版本的計算時間。我知道通過將作業分配給單核心可能會帶來一些開銷,但這應該不會太高以至於最終沒有任何好處:(

也許任何人都可以告訴我關於它的一些事情:(我因爲我想加速一些for循環,第二個問題是,如果有任何命令總是將worker大小設置爲我的計算機中的物理內核數量(並且還使用Hyper當你想運行一個並行工作線程,如果這是一個額外的好處?)

非常感謝!

回答

5

,你應該記住,這是不好的有太多的快速迭代,這是不好的太少緩慢的迭代。如果你做了一百萬次迭代,每次迭代需要幾個毫秒,並行化的開銷將破壞任何可能的增益。如果你做了9次迭代,每次需要一個小時,並且你在8個處理器上並行運行,那麼7個處理器將會空閒一個小時,等待9號迭代完成。

因此,您的示例對於測試並行化的影響相當糟糕,因爲magicrank都太快了。

function testParfor2 
    tic 
    for i=1:4 
     pause(1); %# wait for 1 second 
    end 
    toc 
    matlabpool open 4 
    tic 
    parfor i=1:4 
     pause(1); %# wait for 1 second 
    end 
    toc 

Elapsed time is 4.050287 seconds. 
Elapsed time is 1.534534 seconds. 

請注意,我是跑在同一時間第二並行作業,但是大致的結果應該是可重複的:有位開銷(請注意,我並沒有指望通過matlabpool使用的時間! ),但加速在那裏。如果增加暫停長度,您應該會看到相同數量的開銷。此外,你應該測試你的實際循環(嘗試並行化最外層循環,順便說一句)。

你的第二個問題:

matlabpool open 

因爲有物理內核將創造儘可能多的工人。超線程將幫助您確保計算機在並行作業運行時保持響應。

最後,雖然magicrank可能不是自己完全多線程的,但它們可能會調用多線程例程。

+2

正確。例如,'rank'使用'svd',它是多線程的。 –

+0

好吧,謝謝,所以我會在明天嘗試一些更昂貴的操作:) – tim

+0

@Jonas:'matlabpool open'給我:「使用'local'配置啓動matlabpool ...連接到2個實驗室。從上面的屏幕截圖中可以清楚地看到,我有4個內核,因此這顯然不是預期的結果!?編輯:不知何故,我無法啓動'matlabpool(4)',我得到:您請求最少4名工作人員,但調度程序的ClusterSize屬性目前設置爲允許最多2名工人。要爲比此更多的工作者運行並行作業,請使用配置管理器[...]增加「本地」配置中的ClusterSize屬性設置。 – tim