gpt4 book ai didi

performance - Matlab + CUDA 求解矩阵向量方程 A*x=B 速度慢

转载 作者:太空宇宙 更新时间:2023-11-03 19:35:36 25 4
gpt4 key购买 nike

我正在计算方程 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 在矩阵乘法(相同数据)上要快得多:

>> 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 上)为 rand(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 在 sin 计算中的速度快得令人难以置信。

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

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

最佳答案

请阅读 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 总是会变慢,除非在某些非常特殊的情况下。

关于performance - Matlab + CUDA 求解矩阵向量方程 A*x=B 速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com