数组可以明显慢于MATLAB中的显式循环。为什么?

数组可以明显慢于MATLAB中的显式循环。为什么?

考虑以下简单的速度测试arrayfun:

T = 4000;N = 500;x = randn(T, N);Func1 = @(a) (3*a^2 + 2*a - 1);ticSoln1 = ones(T, N);for t = 1:T
    for n = 1:N
        Soln1(t, n) = Func1(x(t, n));
    endendtocticSoln2 = arrayfun(Func1, x);toc

在我的机器上(LinuxMint 12上的Matlab2011B),这个测试的输出是:

Elapsed time is 1.020689 seconds.Elapsed time is 9.248388 seconds.

什么?!?arrayfun虽然无可否认,这是一个更干净的解决方案,但速度却慢了好几个数量级。这里发生什么事情?

此外,我还做了类似的测试cellfun发现它比一个显式循环慢了大约3倍。同样,这个结果与我所期望的相反。

我的问题是:为什么arrayfuncellfun这么慢?考虑到这一点,是否有充分的理由使用它们(除了使代码看起来很好)?

注:我说的是标准版本的arrayfun这里,不是来自并行处理工具箱的GPU版本。

编辑:我只想说清楚,我知道Func1如Oli所指出的,可以将上面的内容矢量化。我之所以选择它,只是因为为了实际问题的目的,它产生了一个简单的速度测试。

编辑:按照格伦盖塔的建议,我重新做了测试feature accel off..结果如下:

Elapsed time is 28.183422 seconds.Elapsed time is 23.525251 seconds.

换句话说,很大一部分区别在于JIT加速器在加速显式方面做得更好。for循环arrayfun..这对我来说很奇怪,因为arrayfun实际上提供了更多的信息,即它的使用揭示了调用的顺序Func1没关系。另外,我注意到无论JIT加速器是打开还是关闭,我的系统都只使用一个CPU.


慕侠2389804
浏览 747回答 2
2回答

慕娘9325324

因为!x = randn(T, N);不是gpuarray类型;你要做的就是x = randn(T, N,'gpuArray');
打开App,查看更多内容
随时随地看视频慕课网APP