2013-07-13 16 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