【问题标题】:mldivide versus (LU & linsolve)mldivide 与 (LU & linsolve)
【发布时间】:2016-12-02 09:11:19
【问题描述】:

这个问题可能过于宽泛,无法在此处发布,但我会尽可能具体。如果你还是觉得太笼统,我就直接删了。

  • 请查看底部的 EDIT,了解我对该主题的最终想法。
  • 如果您可以访问并行计算工具箱并拥有 NVIDIA GPU,还可以查看 Ander Biguri 的回答。

我的问题:

我正在使用 Newmark 方案(二阶隐式)求解动态方程,其中涉及为 x 求解许多 A*x=b 形式的线性系统。

我已经优化了所有不涉及求解线性系统的代码。就目前而言,线性系统求解在此过程中占用了高达 70% 的计算时间。

虽然我使用了 MATLAB 的 linsolve,但我的矩阵 A 没有任何可以用作 opts 输入的属性 linsolve

想法:

linsolve 的文档中所见:

如果 A 具有 opts 中的属性,则 linsolve 比 mldivide 快, 因为 linsolve 不执行任何测试来验证 A 是否具有 指定属性

据我所知,通过使用mldivide,MATLAB 将使用 LU 分解,因为我的矩阵 A 除了是正方形之外没有任何特定属性。

我的问题:

所以我想知道我是否可以通过首先使用 MATLAB 的 lu 分解 A 来获得一些时间,然后将这些提供给 linsolve 以便解决 x = U\(L\b)opts 分别为上三角和下三角. 这样我就可以防止 MATLAB 执行在 mldivide 过程中发生的所有属性检查。

注意:我绝对不会期待巨大的时间收益。但在长达一周的计算中,即使是 2% 也很重要..

现在你可能会问,我为什么不自己尝试一下呢?好吧,我的计算大约运行到星期二,我想问一下是否有人已经尝试过这个并获得了时间,从而摆脱了由于 mldivide 进行矩阵属性检查而产生的开销。

玩具示例:

A=randn(2500);
% Getting A to be non singular
A=A.'*A;
x_=randn(2500,1);
b=A*x_;
clear x_

% Case 1 : mldivide
tic
for ii=1:100

    x=A\b;

end
out=toc;
disp(['Case 1 time per iteration :' num2str((out)/100)]);

% Case 2 : LU+linsolve

opts1.LT=true;
opts2.UT=true;

tic;
for ii=1:100

    [L,U]=lu(A);

    % It seems that these could be directly replaced by U\(L\b) as mldivide check for triangularity first
    Tmp=linsolve(L,b,opts1);
    x=linsolve(U,Tmp,opts2);

end
out2=toc;

disp(['Case 2 time per iteration :' num2str((out2)/100)]);

编辑

所以我有机会尝试一些事情。

我之前在linsolve 的文档中错过了如果您不指定任何opts 输入,它将默认使用LU 求解器,这正是我想要的。用它做一些时间测试(并考虑到@rayryeng 对“timeit那个坏男孩”的评论),与mldivide相比,它节省了大约 2~3% 的处理时间,如下所示。就时间增益而言,这并不是什么大问题,但在长达一周的计算中却是不可忽视的。

timeit1626*1626 线性系统上得到结果:

mldivide

 t1 =

   0.102149773097083   

linsolve

t2 =

   0.099272037768204

亲戚:0.028171725121151

【问题讨论】:

  • 我认为它不会改变任何东西!为什么 ?如果您阅读 mldivide 的文档,您可以看到用于确定求解器的流程图。在您的情况下,mldivide 将使用 LU 求解器,因此应该没有区别。
  • 唯一的区别是属性检查,在 linsolve 文档中说明需要一些时间
  • “据我所知,通过使用 mldivide,MATLAB 将使用 LU 分解,因为我的矩阵 A 除了正方形之外没有任何特定属性”。检查这个:uk.mathworks.com/help/matlab/ref/mldivide_full.png
  • 在我的特定问题(断层扫描)中,我需要解决 1 个(或很少)Ax=b 问题与大量 A 矩阵。我需要做的实际上是编写我自己的基于 GPU 的算法来完成这项工作,这是解决它的唯一方法。请注意,mldivide 也是内置 gpu 加速的,因此您可以使用它

标签: matlab linear-algebra


【解决方案1】:

我知道您没有 NVIDIA GPU 和并行计算工具箱,但如果您有,这将起作用:

如果您将代码中的第二个测试替换为:

tic;

for ii=1:10
        A2=gpuArray(A); % so we account for memory management
        b2=gpuArray(b);
      x=A2\b2;
end
out2=toc;

我的电脑显示(CPU 与 GPU)

Case 1 time per iteration :0.011881
Case 2 time per iteration :0.0052003

【讨论】:

  • 我不接受这个答案,因为我需要一个 CPU 解决方案。虽然它肯定会帮助那些可以做 GPU 计算的人!
  • 安德斯展示了他的特斯拉的力量:D,我的 Quad-i7 每次迭代平均需要 8 秒。
  • @rayryeng 刚刚复制了 OPs 代码,但你是对的。不过,重点是:GPU 更快:D
猜你喜欢
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 2013-02-24
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多