3

我有一个关于summatlab的问题。

对于向量(1xN 矩阵),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.

但如果我考虑一个 2xN 矩阵,

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似乎并没有从额外的核心中受益。

以前有人遇到过这个吗?我想知道这是否可能是由于索引开销以及sum在 2xN 矩阵的情况下是否可以更快。

非常感谢。

4

1 回答 1

2

这是 MATLAB 不太清楚的事情。每当您创建一个数组时,MATLAB 都会生成一个行向量,但在幕后它实际上更喜欢列向量。因此,在行(第一维)中对数组求和会比在行(第二维)中更快。对于您的情况,如果您转换a为以行为主的表示并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.
于 2013-07-13T14:38:53.573 回答