最近我开发了一种新方法。新方法与CUDA(20到40FPS)完美配合,我已经成功测试了它。当我尝试与旧方法进行比较时,问题出现了。旧方法是在CPU上实现的。首先执行LU分解 A = LU ,然后向前运行+返回步骤以解决( LU ) x = b'/ strong>即可。旧方法的优点是 A 不会改变,因此LU分解只能进行一次,而开销只是前向+后向求解。 A 稀疏和对称肯定。 (我认为这在很多问题上都是相当普遍的做法,例如固定域中的流体模拟。)
为了使我的比较公平,我想在GPU上实现旧方法。但是我没有在cuSolver或cuSparse中找到任何稀疏的LU分解。我应该通过其他一些图书馆来计算吗?我应该用cusolverRfSolve()来解决?如果是这样,为什么 L 和 U 没有输入,但 P 和 Q 输入到此功能?有没有类似于我想做的工作示例?
即使旧方法在GPU上运行较慢,我也很乐意看到它,这使我的新方法非常有用。
答案 0 :(得分:1)
从文档中看,cusolverRfSolve
的预期用途需要以下调用:
cusolverRfCreate
cusolverRfSetup[Host/Device]
< - 这需要输入矩阵L
,U
,P
和Q
cusolverRfAnalyze
cusolverRfRefactor
然后您只需拨打cusolverRfSolve
(再次使用P
和Q
)。之前的调用分析了给定的矩阵并确定了并行策略。
考虑到cuSOLVER文档中的示例,看起来他们故意将LU分解外包,因此您需要为库提供分解矩阵。
我目前正致力于将python(scipy.sparse.linalg.splu
)中的scipy与cuSOLVER接口,以便提供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)。