2013-07-13 19 views
3

我有一個關於sum的問題,在matlab中。Matlab在多維數組上的求和性能

對於載體(1×N個矩陣),sum似乎是並行化。例如,

a=rand(1,100000000); 

maxNumCompThreads(2); 
tic;for ii=1:20;b=sum(a,2);end;toc 

maxNumCompThreads(1); 
tic;for ii=1:20;b=sum(a,2);end;toc 

> Elapsed time is 1.219342 seconds. 
> Elapsed time is 2.393047 seconds. 

但如果不是我考慮一個2×N個矩陣,

a=rand(2,100000000); 

maxNumCompThreads(2); 
tic;for ii=1:20;b=sum(a,2);end;toc 

maxNumCompThreads(1); 
tic;for ii=1:20;b=sum(a,2);end;toc 

> Elapsed time is 7.614303 seconds. 
> Elapsed time is 7.432590 seconds. 

在這種情況下,sum似乎並沒有從額外的核心受益。

以前有人遇到過這個嗎?我想知道這是否可能是由於索引開銷,以及在2xN矩陣的情況下是否有可能使sum更快。

非常感謝。

+0

我看不到這種行爲(matlab 2012a)。 1D陣列的比率爲2線程vs單線程提高〜10%。我得到2D陣列的第一個循環(2個線程)也比第二個(單線程)稍快(2%)。雖然它不如一維陣列有效,但它不是你所報告的。 – bla

+0

@natan感謝您的評論。我使用matlab 2011b和2013a在幾臺機器(2和4個內核)上檢查了這一點,我總是觀察這種行爲。 – user2578309

回答

2

這是MATLAB不太清楚的事情。無論何時你創建一個數組,MATLAB都會生成一個行向量,但是在場景後面它實際上更喜歡列向量。因此,在行(第1維)中求和數組將比在行中(第2維)更快。對於您的情況,如果您將a轉換爲行主要表示並在第1維中執行sum,則可以看到好處。在我的機器上,我收到以下內容

a = rand(100000000, 2); 
maxNumCompThreads(2); 
tic; for ii=1:20; b=sum(a,1); end; toc 
maxNumCompThreads(1); 
tic; for ii=1:20; b=sum(a,1); end; toc 

> Elapsed time is 2.485628 seconds. 
> Elapsed time is 4.381082 seconds. 
+0

非常感謝。我觀察到同樣的行爲。但是,如果給出2XN矩陣,例如'a = rand(2,N)',那麼sum(a,2)'比sum(a。')快_much_。儘管後者明顯受益於並行計算,轉置成爲瓶頸...... – user2578309