我已经在Linux系统上用C++写了一个代码,它解决了线性系统A x = b
,其中A
是使用以下两种方法的稀疏对称矩阵:
UMFPACK
顺序分解并进行向后正向替换。 UMFPACK
顺序分解,然后使用cuSPARSE
库进行向后正向替换。 我拥有的系统配置是:CUDA版本5.0,
UMFPACK
版本5.6.2,Linux内核版本Debian 3.2.46-1,使用的图形卡:GeForce GTX Titan。从理论上讲,第二种方法应该比第一种方法具有更好的性能,并且错误最少或没有错误。但是,我观察到以下问题:
UMFPACK
函数的向后/向前替换几乎比CUDA变体快2x
。 UMFPACK
和CUDA获得的结果之间的误差非常大,最大误差为3.2537
,而对于其他矩阵,约为1e-16
。 附件是我的tar文件,其中包含以下组件:
UMFPACK
的所有依赖项(我们也将其用于计算)。 tar文件的链接是
https://www.dropbox.com/s/9qfs5awclshyk3b/code.tar.gz
如果您希望运行代码,则在我的系统中的factorize_copy目录中提供了 MAKEFILE 。您可能需要重新编译
UMFPACK
库。下面还显示了我们的程序的
586 x 586
稀疏矩阵的示例输出(请注意,与我们检查的其他稀疏矩阵相比,这种情况下的错误非常高)。*****阅读网格
读取网格成功
*****解决尺寸为586x586的稀疏矩阵
*****在umfpack上解决网格
*****分解网格
--------------用于umfpack分解的CPU时间为:0.00109107
--------------- umfpack分解的挂钟时间为:0
成功分解网格
成功解决umfpack上的网格
-------------- umfpack解决的CPU时间为:6.281e-05
*****分配GPU内存并复制数据
----------------分配GPU内存和复制数据的CPU时间:1.6
*****执行b = P * b以说明A中的行顺序
矩阵向量(Pb)乘法成功
*****解决系统:LUx = b
分析Ly = b成功
解决Ly = b成功
分析Ux = y成功
成功解决Ux = y
*****执行x = Q * x以说明A中的列顺序
矩阵向量(Qx)乘法成功
---------- GPU的求解时间为:5.68029 ms
##### UMFPACK和CUDA之间的最大错误:3.2537
##### UMFPACK和CUDA之间的平均错误:0.699926
*****将结果写入输出文件
结果写入文件“vout_586.m”和文件“vout_umfpack_586.m”
(操作成功!)
如果有人能指出这种情况下可能出现的错误,我将不胜感激。如果我错过了使用CUDA解决稀疏线性系统的更好方法,请告诉我。
编辑:我弄清楚了为什么在某些情况下会出现错误,而在某些情况下却没有。在代码中调用内核函数时,每个块的线程数有一个错误。但是,我仍然有加速的问题。
最佳答案
如果要处理在CPU上花费亚毫秒级时间的问题,考虑到gpu计算涉及的所有延迟,您几乎无法期望gpu的执行速度更快。