我编写了一个CUDA C和C程序,使用CULA例程dgesv和MKL例程dgesv来求解矩阵方程Ax = b。对于小型数据集来说,CPU程序似乎比GPU程序更快。但随着数据集增加到500,GPU克服了CPU。我正在使用我的dell笔记本电脑,它拥有i3 CPU和Geforce 525M GPU。 GPU初始性能降低的最佳解释是什么?
我写了另一个程序,它接受两个向量,将它们相乘并添加结果。这就像点积一样,结果是矢量和不是标量。在这个程序中,即使对于小数据集,GPU也比CPU快。我使用的是同一个笔记本。与上面解释的相比,为什么即使对于小数据集,GPU在此程序中的速度更快?是因为总和中涉及的计算量不多吗?
答案 0 :(得分: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的“成本”可以通过将其与计算工作重叠来隐藏,那么重叠部分的“成本”变为“免费”,即它对整体解决方案没有贡献时间。