【问题标题】:Why is solving system of linear equations using cula(dgesv) slower than mkl (dgesv) for small data sets对于小型数据集,为什么使用 cula(dgesv) 求解线性方程组比 mkl (dgesv) 慢
【发布时间】:2013-01-09 07:12:26
【问题描述】:

我编写了一个 CUDA C 和 C 程序,使用 CULA 例程 dgesv 和 MKL 例程 dgesv 求解矩阵方程 Ax=b。似乎对于一个小数据集,CPU 程序比 GPU 程序快。但是随着数据集增加到超过 500,GPU 克服了 CPU。我正在使用我的戴尔笔记本电脑,它有 i3 CPU 和 Geforce 525M GPU。对 GPU 最初性能缓慢的最佳解释是什么?

我编写了另一个程序,它接受两个向量,将它们相乘并相加。这就像点积一样,只是结果是向量和而不是标量。在这个程序中,即使对于小数据集,GPU 也比 CPU 快。我正在使用同一个笔记本。为什么与上面解释的相比,即使对于小数据集,该程序中的 GPU 也更快?是不是因为求和的计算量不大?

【问题讨论】:

  • 通讯开销!为了加速,GPGPU 系统中的数据传输(以 PCI-E 带宽)开销不应成为应用程序的瓶颈。在小数据集中,不值得在 GPU 上移动小数据,因为计算量可以忽略不计。在这种情况下,内核启动和数据移动时间决定了导致性能下降的计算加速优势。
  • 当 GPU 上的计算时间减少(超过 CPU)超过数据传输的成本时,GPU 将提供好处。我相信求解线性方程组是somewhere between O(n^2) and O(n^3) complexity。对于非常小的 n,这种计算复杂度可能不足以抵消数据传输的成本。但显然随着 n 变大它应该。另一方面,您的向量运算可能只有 O(n) 复杂度。因此,收益情况看起来会有所不同。
  • @RobertCrovella: dgesv 有一个 RHS 的模型 FLOP 计数通常取为0.67n^3
  • 感谢您的洞察力。解释清楚
  • @RobertCrovella:也许您可以将其添加为答案,以便将问题从未回答的列表中删除。

标签: cuda gpgpu intel-mkl cula


【解决方案1】:

与大型数据集相比,GPU 对小型数据集的兴趣较少的情况并不少见。其原因会因具体算法而异。 GPU 通常具有比 CPU 更高的主内存带宽,并且通常在重型数字运算方面也可以胜过它们。但是 GPU 通常只有在问题中存在固有的并行性时才能很好地工作,这可能会暴露出来。利用这种并行性,算法可以利用更大的内存带宽以及更高的计算能力。

但是,在 GPU 执行任何操作之前,必须将数据传输到 GPU。这对 GPU 版本的代码产生了“成本”,而这通常不会出现在 CPU 版本中。

更准确地说,当 GPU 上的计算时间减少(超过 CPU)超过数据传输的成本时,GPU 将提供好处。我相信求解线性方程组的复杂度介于 O(n^2) 和 O(n^3) 之间。对于非常小的 n,这种计算复杂度可能不足以抵消数据传输的成本。但显然随着 n 变大它应该。另一方面,您的向量运算可能只有 O(n) 复杂度。因此,收益情况看起来会有所不同。

对于 O(n^2) 或 O(n^3) 的情况,随着我们移动到更大的数据集,传输数据的“成本”会随着 O(n) 而增加,但解决方案的计算需求也会增加为 O(n^2)(或 O(n^3))。因此,更大的数据集应该具有指数更大的计算工作负载,从而降低数据传输“成本”的影响。另一方面,O(n) 问题可能不会有这种缩放动态。工作量的增加速度与数据传输的“成本”相同。

另请注意,如果将数据传输到 GPU 的“成本”可以通过与计算工作重叠来隐藏,那么重叠部分的“成本”将变为“免费”,即它对整体解决方案没有贡献时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    相关资源
    最近更新 更多