Performance Matlab+;CUDA求解矩阵向量方程A*x=B的速度慢

Performance Matlab+;CUDA求解矩阵向量方程A*x=B的速度慢,performance,matlab,matrix,cuda,linear-algebra,Performance,Matlab,Matrix,Cuda,Linear Algebra,我在计算一个方程A*x=B,其中A是矩阵,B是向量,x是答案(未知)向量 硬件规格: 英特尔i7 3630QM(4核), nVidia GeForce GT 640M(384个CUDA芯) 下面是一个例子: >> A=rand(5000); >> B=rand(5000,1); >> Agpu=gpuArray(A); >> Bgpu=gpuArray(B); >> tic;A\B;toc; Elapsed time is 1

我在计算一个方程A*x=B,其中A是矩阵,B是向量,x是答案(未知)向量

硬件规格: 英特尔i7 3630QM(4核), nVidia GeForce GT 640M(384个CUDA芯)

下面是一个例子:

>> A=rand(5000);

>> B=rand(5000,1);

>> Agpu=gpuArray(A);

>> Bgpu=gpuArray(B);

>> tic;A\B;toc;

Elapsed time is 1.382281 seconds.

>> tic;Agpu\Bgpu;toc;

Elapsed time is 4.775395 seconds.
不知怎的,GPU速度要慢得多。。。为什么?它在FFT、INV、LU计算中也较慢,这应该与矩阵除法有关

但是,GPU的矩阵乘法速度要快得多(相同的数据):

主要问题是为什么GPU A\B(mldivide)比CPU慢

更新

以下是A、B(CPU上)、AA、BB(GPU上)为兰特(5000)时的更多结果:

大胆的时代是稳定的时代。然而,GPU的速度几乎慢了两倍。顺便问一下,为什么GPU在前两次尝试时速度更慢?是否先编译两次

此外:

>> tic;sin(A);toc;
Elapsed time is *0.121008* seconds.
>> tic;sin(AA);toc;
Elapsed time is 0.020448 seconds.
>> tic;sin(AA);toc;
Elapsed time is 0.157209 seconds.
>> tic;sin(AA);toc;
Elapsed time is *0.000419 *seconds
经过两次计算后,GPU在sin计算中的速度惊人地快

那么,为什么GPU在矩阵除法、fft和类似计算方面如此缓慢,尽管它在矩阵乘法和三角运算方面如此之快?问题其实不应该是这样的。。。GPU在所有这些计算中应该更快,因为Matlab已经为GPU发布了重叠函数(mldivide,fft)


有人能帮我解决这些问题吗?:)

请阅读Matlab是如何计算解决方案的。这将帮助您理解为什么GPU速度较慢

我会尽量用几句话说出来

A*x=b变为L*(U*x=y)=b,L*U=A

  • 因此,Matlab将A转换为L*U(这个过程不能完全并行完成) 据我所知,由于以下原因,有些步骤可以并行执行: (其性质)
  • 然后Matlab解出L*y=B并找到y。(此过程无法完成 并行,因为每个步骤都需要来自上一步的数据)
  • 然后Matlab解出U*x=y并找到x。(此过程无法完成 并行,因为每个步骤都需要来自上一步的数据)

  • 因此,它的GPU时钟比CPU慢,而且由于进程不能并行完成,CPU速度更快。不,除非你想出一个更好的方法(祝你好运!),否则GPU的速度总是会慢一些,除非是在一些非常特殊的情况下。

    解释的第一部分在用户2230360的回答中,但你的问题有两个方面,所以我会补充一点关于乘法的内容


    如前所述,即使可以执行某些步骤,LU分解也不容易并行化。然而,矩阵乘法在很大程度上是可并行的。如果你在做这些事情,你应该能够用手做矩阵乘法,然后你就会知道,计算A*B=C中矩阵C的元素可以按照你想要的任何顺序进行——因此有可能进行并行计算。这可能就是为什么你看到线性系统的乘法运算速度如此之快,但求解速度却如此之慢。一个不能“像另一个一样”并行化。

    虽然这不是确切的情况,因为您使用的是直接解算器而不是krylov子空间方法,但在Viecal网站上有一些有趣的信息正在进行基准测试。如果你看一下这个:你会注意到,在几乎所有情况下,对于较小的矩阵,cpu都比gpu快,这部分是由于迭代解算器的性质,但也正如他们所说的那样,这是“由于PCI Express延迟,不可避免的gpu内核启动开销”的结果这可能会对您产生类似的影响。@johnish我不确定在这种情况下,较长的时间应该归因于由于PCI Express延迟导致的GPU内核启动开销。对于相同大小的矩阵,GPU上的矩阵乘法需要0.000505s,因此我认为这样的开销小于0.00050s,而mldivide需要4.775395s。我的结论是,在这种情况下,延迟被处理时间完全掩盖了,正如您所观察到的,对于“小”矩阵,处理时间可能比CPU上的时间长。直到最近,Accelereyes Jacket在这类任务中做得很好,但现在它似乎已经被纳入了Matlab中。应该注意的是,
    mldivide
    (至少在CPU版本中)根据输入矩阵属性具有不同的执行路径。但对于一般非对称非三角方稠密矩阵,确实使用了LU分解:
    >> tic;fft(A);toc;
    Elapsed time is *0.117189 *seconds.
    >> tic;fft(AA);toc;
    Elapsed time is 1.062969 seconds.
    >> tic;fft(AA);toc;
    Elapsed time is 0.542242 seconds.
    >> tic;fft(AA);toc;
    Elapsed time is *0.229773* seconds.
    >> tic;fft(AA);toc;
    
    >> tic;sin(A);toc;
    Elapsed time is *0.121008* seconds.
    >> tic;sin(AA);toc;
    Elapsed time is 0.020448 seconds.
    >> tic;sin(AA);toc;
    Elapsed time is 0.157209 seconds.
    >> tic;sin(AA);toc;
    Elapsed time is *0.000419 *seconds