0

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

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

4

1 回答 1

2

与大型数据集相比,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 的“成本”可以通过将其与计算工作重叠来隐藏,那么重叠部分的“成本”将变为“免费”,即它不会影响整体求解时间。

于 2013-01-08T23:12:26.797 回答