[英]Matlab + CUDA slow in solving matrix-vector equation A*x=B
我正在計算方程A * x = B,其中A是矩陣,B是矢量,x是答案(未知)矢量。
硬件規格:Intel 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在罪計算中的速度非常快。
那么,為什么GPU在矩陣除法,fft和類似的計算中如此緩慢,盡管它在矩陣乘法和三角函數中如此之快? 問題實際上不應該是這樣......在所有這些計算中GPU應該更快,因為Matlab已經發布了GPU的重疊函數(mldivide,fft)。
請問有人幫我解決這些問題嗎? :)
請閱讀Matlab如何計算解決方案。 它將幫助您理解為什么GPU速度較慢。
我會試着用幾句話說出來。
A * x = b變為L *(U * x = y)= b,L * U = A.
因此GPU時鍾比CPU慢,並且由於進程不能並行完成,因此CPU速度更快。 不,除非你提出一個更好的方法(祝你好運!)然后GPU將總是較慢,除非在一些非常具體的情況下。
解釋的第1部分來自user2230360的答案,但你的問題是雙重的,所以我將添加一些關於乘法的內容。
如前所述,即使有一些步驟,LU分解也不是很容易並行化。 然而,矩陣乘法是非常可並行化的。 如果您正在使用這些東西,您應該能夠手工進行矩陣乘法,然后您就會知道在A * B = C中計算矩陣C的元素可以按您想要的任何順序進行 - 因此可能性用於並行計算。 這可能就是為什么你看到閃電般的快速乘法,但線性系統的解決速度很慢。 一個人不能“和另一個人一樣多”並行化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.