求解Ax = b,CUDA与Matlab

时间:2018-12-21 17:37:36

标签: matlab cuda equation linear

我已经在Matlab上进行了以下测试:

n = 10000;
A = rand(n,n);
b = rand(n, 1);

tic
y = A\b;
toc

在我的Intel i7 gen 5机器(12核)上,结果约为5秒。

然后,我尝试使用CUDA 9.2示例SDK代码执行相同的操作(请参阅cuSolverDn_LinearSolver.cpp)。令人惊讶的是,在我的Nvidia 970GTX上,我得到了大约6.5秒的时间才能获得与上述相同的问题大小的解决方案!

怎么了?我提到我的矩阵是对称的,正方形,b只有1列。有没有更好的方法使用CUDA解决此问题?如果我要使用较新的GPU,应该期待更高的性能吗?

1 个答案:

答案 0 :(得分:2)

这是我用来测试的代码

n = 10000;
A = rand(n,n,'single');
b = rand(n, 1,'single');

tic
y = A\b;
toc

A = gpuArray(A);
b = gpuArray(b);

tic
y = A\b;
toc

这是结果

Elapsed time is 2.673490 seconds.
Elapsed time is 0.553348 seconds.

我正在运行带有GTX 1060 GPU的7700 4核笔记本电脑,因此我认为大约具有相同的计算能力。如您所见,这种情况下GPU的运行速度更快。最可能的因素是精度。 GPU仅具有单精度乘法器,而CPU具有双精度乘法器。如果必须在GPU上执行双精度乘法,则必须使用多个乘法器来执行相同的运算,从而极大地降低了速度。如果我更改它,以便变量是双精度的,我们现在得到:

Elapsed time is 5.784525 seconds.
Elapsed time is 5.398702 seconds.

尽管我的计算机上GPU的运行速度仍然更快,但仍然有一个问题,就是现在CPU和GPU的距离更近了。