【问题标题】:Solving Ax = b , CUDA vs Matlab [closed]求解 Ax = b ,CUDA vs Matlab [关闭]
【发布时间】:2019-05-22 03:55:34
【问题描述】:

我在 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,我应该期待更高的性能吗?

【问题讨论】:

  • A = rand(n,n); 如何产生对称矩阵,正如您在问题中所说的那样?
  • 您是否以单精度或双精度进行了实验?顺便说一句,12 核 i7 是一台相当强大的机器。
  • 尝试使用 Matlabs gpu funcionality,看看它有多快。如果它比 cpu 代码快,那么你当然可以做得更好,如果不是,那么好处可能会被开销所抵消
  • 在 cpp 中我使它对称,而不是在 matlab 中。我正在使用双打。

标签: matlab cuda linear-equation


【解决方案1】:

这是我用来测试的代码

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 现在更接近了。

【讨论】:

  • 在 CPU 上看到 double 的速度是 single 的一半很有趣。这表明瓶颈是从内存到 CPU 的数据传输,因为 CPU 使用与双浮点数相同的表示进行单浮点计算(对于现代 CPU,通常为 10 字节,长双精度)。
  • 我知道,我也对此感到惊讶。问题是数据传输应该小得多,因为它只有 10000 个值。我们确定现代 CPU 没有单精度内核吗?它们都是双精度的吗?
  • SSE/AVX 向量单元每个周期计算的浮点数是双精度数的两倍。这可能是这些操作背后的优化 BLAS 级别使用的内容
  • “GPU 仅具有单精度乘法器”:自费米架构(大约 10 年前)以来,所有 NVIDIA GPU 都包含双精度算术单元。但是,双精度运算的吞吐量仅为单精度运算的 1/2 到 1/64,消费级 GPU(如询问者的 GPU)处于低端。
  • MATLAB 将英特尔 MKL 用于其 BLAS(和 LAPACK)实现,它肯定使用支持最高的向量指令集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2018-08-06
  • 2016-06-15
  • 1970-01-01
  • 2015-07-18
  • 2013-02-01
相关资源
最近更新 更多