求解 Ax = b,CUDA 与 Matlab
Solving Ax = b , CUDA vs Matlab
我在 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,我是否应该期待更高的性能?
这是我用来测试这个的代码
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 只有单精度乘法器,而 CPUs 有双精度乘法器。如果你必须在 GPU 上做双精度乘法,你必须用很多乘法器来做同样的操作,从而大大降低你的速度。如果我改变它使变量是双精度的,我们现在得到:
Elapsed time is 5.784525 seconds.
Elapsed time is 5.398702 seconds.
虽然 GPU 在我的电脑上仍然更快,但问题仍然在于 CPU 和 GPU 现在靠得更近了。
我在 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,我是否应该期待更高的性能?
这是我用来测试这个的代码
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 只有单精度乘法器,而 CPUs 有双精度乘法器。如果你必须在 GPU 上做双精度乘法,你必须用很多乘法器来做同样的操作,从而大大降低你的速度。如果我改变它使变量是双精度的,我们现在得到:
Elapsed time is 5.784525 seconds.
Elapsed time is 5.398702 seconds.
虽然 GPU 在我的电脑上仍然更快,但问题仍然在于 CPU 和 GPU 现在靠得更近了。