Cuda 对于小数据集,为什么使用cula(dgesv)求解线性方程组比使用mkl(dgesv)求解慢

Cuda 对于小数据集,为什么使用cula(dgesv)求解线性方程组比使用mkl(dgesv)求解慢,cuda,gpgpu,intel-mkl,cula,Cuda,Gpgpu,Intel Mkl,Cula,我编写了一个CUDA C和C程序,使用CULA例程dgesv和MKL例程dgesv求解矩阵方程Ax=b。似乎对于一个小数据集,CPU程序比GPU程序快。但是,当数据集增加到超过500时,GPU克服了CPU。我正在使用我的戴尔笔记本电脑,它有i3CPU和Geforce 525M GPU。GPU最初性能缓慢的最佳解释是什么 我写了另一个程序,它取两个向量,将它们相乘,然后将结果相加。这就像点积一样,结果是向量和而不是标量。在这个程序中,即使对于小数据集,GPU也比CPU快。我用的是同一本笔记本。为什

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


我写了另一个程序,它取两个向量,将它们相乘,然后将结果相加。这就像点积一样,结果是向量和而不是标量。在这个程序中,即使对于小数据集,GPU也比CPU快。我用的是同一本笔记本。为什么在这个程序中,即使对于小数据集,GPU也比上面解释的要快?这是因为求和过程中没有太多的计算吗?

与大数据集相比,GPU对小数据集不感兴趣的情况并不少见。其原因因具体算法而异。GPU通常比CPU具有更高的主内存带宽,并且在重载数字运算方面通常也比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的“成本”可以通过将其与计算工作重叠来隐藏,那么重叠部分的“成本”将变为“免费”,即,它不影响整体解决方案时间

通信开销!为了加速,GPGPU系统中的数据传输(PCI-E带宽)开销不应成为应用程序的瓶颈。在小数据集中,不值得在GPU上移动小数据,因为计算可以忽略不计。在这种情况下,内核启动和数据移动时间决定了计算加速带来的好处,从而导致性能下降。当GPU(通过CPU)上计算时间的减少超过数据传输的成本时,GPU将提供好处。我相信解一个线性方程组是非常困难的。对于非常小的n,这种计算复杂性可能不足以抵消数据传输的成本。但很明显,当n变大时,它应该是。另一方面,向量运算可能只有O(n)复杂度。因此,受益场景看起来会有所不同。@RobertCrovella:dgesv的模型失败计数与一个RHS通常被视为。感谢您的洞察力。嗯explained@RobertCrovella:也许你可以加上这个作为答案,以便把这个问题从未回答的问题列表中去掉。