2013-02-16 20 views
6

我正在计算方程A * x = B,其中A是矩阵,B是向量,x是回答(未知)向量。Matlab + CUDA求解矩阵向量方程的速度很慢A * x = B

硬件规格: 英特尔酷睿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快得多在矩阵乘法(相同的数据):

>> tic;A*B;toc; 

Elapsed time is 0.014700 seconds. 

>> tic;Agpu*Bgpu;toc; 

Elapsed time is 0.000505 seconds. 

主要的问题是为什么GPU A \ B(mldivide)是如此之慢比较CPU?

修订

下面是一些结果当A,B(在CPU),AA,BB(上GPU)是兰特(5000):

>> 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; 

粗体时间是稳定的倍。但是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的计算是非常快的罪恶计算。那么,为什么GPU在矩阵分割,fft和类似的计算中如此缓慢,尽管它在矩阵乘法和三角学中速度如此之快?这个问题实际上不应该是这样的...... GPU在所有这些计算中应该更快,因为Matlab已经为GPU发布了重叠函数(mldivide,fft)。

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

+0

虽然这不是确切的情况,但是您使用的是直接解算器而不是krylov子空间方法,但在基准测试下的vienacl站点上有一些有趣的信息。如果你看看这个:http://viennacl.sourceforge.net/viennacl-benchmarks.html,你会注意到在几乎所有情况下,对于较小的矩阵,cpu比gpu更快,这部分是由于迭代求解器,但它也是因为“由于PCI-Express延迟导致的不可避免的GPU内核启动开销”的结果,这可能对您有类似的影响。 – johnish 2013-02-17 01:11:33

+0

@johnish我不确定在这种情况下,PCI-Express延迟导致GPU内核启动开销的时间应该更长。对于相同大小的矩阵,GPU上的矩阵乘法需要0.000505秒,所以我会得出这样的结论:<0.000505s,而mldivide需要4.775395s。正如你观察到的那样,我将得出结论,在这种情况下,潜伏期被处理时间完全掩盖,处理时间可能比“小”矩阵的CPU更长。最近发生的情况是,Accelereyes Jacket为这些任务做了很好的工作,但现在似乎它已经被纳入Matlab了。 – JackOLantern 2013-02-17 08:21:56

回答

4

请阅读Matlab如何计算解决方案。它会帮助你理解为什么GPU更慢。

我会尽力用几句话说出来。

A * X = B变成L *(U * X = Y)= B,L * U = A

  1. 所以Matlab的使A至L * U(这个过程不能做完全平行 据我所知,一些步骤可以并行完成,由于 其性质)
  2. 然后,Matlab解决L * y = B并找到y。 (这个过程不能并行完成,因为每个步骤需要先前的数据)
  3. 然后,Matlab解出U * x = y并找到x。 (这个过程不能做 平行每一步从以前需要的数据)

因此GPU时钟比CPU慢,并且由于过程不能做平行,CPU更快。不,除非你提出了一个更好的方法(祝你好运!),否则GPU会一直比较慢,除非在某些特定情况下。

+0

应该注意的是,'mldivide'(至少在CPU版本中)具有不同的执行路径,具体取决于输入矩阵的属性。但对于一般的非对称非三角形平方稠密矩阵,实际上使用了LU分解:http://www.mathworks.com/support/solutions/en/data/1-172BD/index.html?product=ML&solution= 1-172BD – Amro 2013-07-11 16:16:25

1

解释的第一部分来自user2230360的答案,但是您的问题是双重的,所以我会补充一点关于乘法的内容。

如前所述,即使有些步骤可以,LU分解也不是很容易并行化。但是,矩阵乘法是非常平行的。如果您正在处理这些事情,您应该可以手动进行矩阵乘法运算,然后您就会知道计算A * B = C中矩阵C的元素可以按您想要的任何顺序进行 - 因此可能性用于并行计算。这可能就是为什么你看到如此快速的倍增,但线性系统解决缓慢。一个人不可能和其他人一样“并行化”。

相关问题