为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕侠2389804 2019-06-20 15:34:47
数组可以明显慢于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倍。同样,这个结果与我所期望的相反。我的问题是:为什么arrayfun和cellfun这么慢?考虑到这一点,是否有充分的理由使用它们(除了使代码看起来很好)?注:我说的是标准版本的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.
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

因为!

x = randn(T, N);

不是gpuarray类型;

你要做的就是

x = randn(T, N,'gpuArray');


查看完整回答
反对 回复 2019-06-20
  • 2 回答
  • 0 关注
  • 783 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信