cuda - 如何使用 CUDA 的 cuSolver 重复前向和后向求解?

标签 cuda gpu cusolver

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

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

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

最佳答案

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

  • cusolverRfCreate
  • cusolverRfSetup[Host/Device] <-- 这将矩阵 LUP 作为输入Q
  • cusolverRfAnalyze
  • cusolverRfRefactor

然后您只需调用cusolverRfSolve(同样使用PQ)。前面的调用分析给定的矩阵并确定并行策略。

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

我目前正在研究 python 中的 scipy (scipy.sparse.linalg.splu) 与 cuSOLVER 的接口(interface),以提供 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 )。

关于cuda - 如何使用 CUDA 的 cuSolver 重复前向和后向求解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29474604/

相关文章:

tensorflow - 关于忽略可见GPU设备的消息

amazon-ec2 - 新的 Amazon EC2 集群 GPU 实例的体验如何?

cuda - 错误 : ‘blockIdx’ was not declared in this scope

cuda - 仅使用 CUDA 计算奇异值

c++ - 用于各种 b 的稀疏带状 Ax=b 的批量 CUDA 解决方案

c++ - CUDA 纹理和夹紧

cuda - l1 用于 CUDA CC 3.0 的共享银行冲突分析器计数器

c++ - 如何仅针对一项功能禁用 Cuda 主机设备警告?

matrix - 使用 cuSolver 计算一般矩阵的逆的最有效方法是什么?

c++ - CUDA 链接错误(Lib 到 Dll)