【问题标题】:How to repeat forward and backward solve using cuSolver by CUDA?如何使用 CUDA 的 cuSolver 重复前向和后向求解?
【发布时间】:2015-06-11 01:08:08
【问题描述】:

最近我开发了一种新方法。新方法与 CUDA(20 到 40FPS)完美配合,我已经成功地对其进行了测试。当我尝试与旧方法进行比较时,问题就来了。旧方法是在 CPU 上实现的。它先进行 LU 分解 A=LU,然后运行 ​​forward+back 步骤求解 (LU)x =b。旧方法的好处是 A 不会改变,因此 LU 分解只能进行一次,开销只是前向+后向求解。 A稀疏的对称正定的。 (我相信这是在许多问题中相当普遍的做法,例如,固定域中的流体模拟。

为了公平起见,我想在 GPU 上实现旧方法。但是我在 cuSolver 或 cuSparse 中没有发现任何稀疏的 LU 分解。我应该由其他一些库来计算它吗?我应该使用 cusolverRfSolve() 求解吗?如果是这样,为什么不输入LU,而输入PQ?有没有类似于我正在尝试做的工作示例?

即使旧方法在 GPU 上运行速度较慢,我也很乐意看到它,这使我的新方法非常有用。

【问题讨论】:

    标签: cuda gpu cusolver


    【解决方案1】:

    从文档来看,cusolverRfSolve 的预期用途似乎需要以下先前调用:

    • cusolverRfCreate
    • cusolverRfSetup[Host/Device] L、UPQ 作为输入
    • cusolverRfAnalyze
    • cusolverRfRefactor

    然后你只打电话给cusolverRfSolve(同样是PQ)。前面的调用分析给定的矩阵并确定并行策略。

    鉴于 cuSOLVER 文档中的示例,看起来他们有意外包了 LU 因式分解,因此您需要将分解后的矩阵提供给库。

    我目前正在将 python (scipy.sparse.linalg.splu) 中的 scipy 与 cuSOLVER 连接起来,以提供 LU 分解Pr * A * Pc = L * U。 cuSOLVER 将需要P = Pr.TQ = Pc.T。您可以使用cusolverRfSetupHost 函数让 cuSOLVER 负责 GPU 内存分配和传输。

    也可以在 C++ 中使用 suitesparse (http://faculty.cse.tamu.edu/davis/suitesparse.html)。

    【讨论】:

      猜你喜欢
      • 2015-05-09
      • 2021-06-08
      • 1970-01-01
      • 2013-01-22
      • 2017-08-25
      • 2020-01-23
      • 2017-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多