我在matlab中有一个关于sum
的问题。
对于向量(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
似乎没有从额外核心中受益。
之前有人遇到过这个吗?我想知道这是否可能是由于索引开销以及是否有可能在2xN矩阵的情况下使sum
更快。
非常感谢。
答案 0 :(得分: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.