如何使用CUDA的cuSolver重复前后解决?

时间:2015-04-06 15:48:15

标签: cuda gpu cusolver

最近我开发了一种新方法。新方法与CUDA(20到40FPS)完美配合,我已经成功测试了它。当我尝试与旧方法进行比较时,问题出现了。旧方法是在CPU上实现的。首先执行LU分解 A = LU ,然后向前运行+返回步骤以解决( LU x = b'/ strong>即可。旧方法的优点是 A 不会改变,因此LU分解只能进行一次,而开销只是前向+后向求解。 A 稀疏对称肯定。 (我认为这在很多问题上都是相当普遍的做法,例如固定域中的流体模拟。

为了使我的比较公平,我想在GPU上实现旧方法。但是我没有在cuSolver或cuSparse中找到任何稀疏的LU分解。我应该通过其他一些图书馆来计算吗?我应该用cusolverRfSolve()来解决?如果是这样,为什么 L U 没有输入,但 P Q 输入到此功能?有没有类似于我想做的工作示例?

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

1 个答案:

答案 0 :(得分:1)

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

  • cusolverRfCreate
  • cusolverRfSetup[Host/Device]< - 这需要输入矩阵LUPQ
  • 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)。