我编写了一个CUDA C和C程序来求解矩阵方程Ax=b,使用CULA例程dgesv和MKL例程dgesv。对于一个小数据集来说,CPU程序比GPU程序更快。但是GPU克服了CPU,因为数据集超过500。我正在使用我的戴尔笔记本电脑,它有i3 CPU和Geforce 525M GPU。GPU最初缓慢性能的最佳解释是什么?
我编写了另一个程序,它需要两个向量,将它们相乘,并将结果相加。这就像点积,结果是向量和,而不是标量。在这个程序中,GPU比CPU更快,即使是小数据集也是如此。我用的是同一个笔记本。为什么GPU在这个程序中比上面解释的小数据集更快?是不是因为在求和过程中计算不多呢?
发布于 2013-01-08 23:12:26
与大型数据集相比,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的“成本”可以通过将其与计算工作重叠来隐藏,则重叠部分的“成本”将变为“免费”,也就是说,它不会对整个解决方案时间有所贡献。
https://stackoverflow.com/questions/13560883
复制相似问题