我正在计算一个方程 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 在 sin 计算中的速度非常快。
那么,为什么 GPU 在矩阵除法、fft 和类似计算中如此缓慢,而在矩阵乘法和三角函数中却如此之快?这个问题实际上不应该是这样的...... GPU 在所有这些计算中应该更快,因为 Matlab 已经为 GPU 发布了重叠函数(mldivide,fft)。
有人可以帮我解决这些问题吗?:)