最近我开发了一种新方法。新方法与 CUDA 完美配合(20 至 40FPS),并且我已经成功测试了它。当我尝试与旧方法进行比较时,问题就出现了。旧方法是在CPU上实现的。它首先进行 LU 分解A=LU,然后运行前向+后向步骤来求解 (LU)x =b。旧方法的好处是 A 不会改变,因此 LU 分解只需进行一次,开销只是前向+后向求解。 A 是稀疏且对称正定。 (我相信这在许多问题中是相当常见的做法,例如固定域中的流体模拟。)
为了公平比较,我想在 GPU 上实现旧方法。但我在 cuSolver 或 cuSparse 中没有发现任何稀疏 LU 分解。我应该通过其他一些库来计算它吗?我应该使用 cusolverRfSolve() 来求解吗?如果是这样,为什么这个函数没有输入L和U,而是输入P和Q?有没有与我想做的类似的工作示例?
即使旧方法在 GPU 上运行速度较慢,我也很乐意看到它,这使得我的新方法非常有用。
最佳答案
从文档来看,cusolverRfSolve
的预期用途需要以下先前调用:
cusolverRfCreate
cusolverRfSetup[Host/Device]
<-- 这将矩阵L
、U
、P 作为输入
和Q
cusolverRfAnalyze
cusolverRfRefactor
然后您只需调用cusolverRfSolve
(同样使用P
和Q
)。前面的调用分析给定的矩阵并确定并行策略。
鉴于 cuSOLVER 文档中的示例,看起来他们有意将 LU 因式分解外包,因此您需要向库提供因式分解矩阵。
我目前正在研究 python 中的 scipy (scipy.sparse.linalg.splu
) 与 cuSOLVER 的接口(interface),以提供 LU 分解Pr * A * Pc = L * U
。 cuSOLVER 将需要 P = Pr.T
和 Q = 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/