我已经在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文件,其中包含以下组件:
  • 我用于解决线性系统的主文件 fc.cu 的文件夹factorize_copy。它从 grid _ * _ CSC.m 文件中读取稀疏矩阵,这些文件也存在于同一目录中。为了方便起见,在文本文件中还提供了提供的三个稀疏矩阵的结果。
  • 一个文件夹,其中包含用于编译和运行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的执行速度更快。

    07-26 06:26