1

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

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

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

4

1 回答 1

1

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

  • cusolverRfCreate
  • cusolverRfSetup[Host/Device]< --这已经将矩阵L,UPQ
  • cusolverRfAnalyze
  • cusolverRfRefactor

然后你只打电话cusolverRfSolve(再次用Pand Q)。前面的调用分析给定的矩阵并确定并行策略。

鉴于 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-06-04T13:23:01.293 回答