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

标签 c++ cuda sparse-matrix matrix-factorization cusolver

我有一个稀疏带状矩阵 A,我想(直接)求解 Ax=b。我有大约 500 个 vector b,所以我想求解相应的 500 个 x。 我是 CUDA 的新手,所以我对可用的选项有点困惑。

cuSOLVER 有一个批处理直接求解器 cuSolverSP,用于稀疏 A_i x_i = b_i 使用 QR here . (我对 LU 也很好,因为 A 的条件很好。)但是,据我所知,我无法利用我所有的 A_i 都相同的事实。

另一种选择是先在 CPU 或 GPU 上确定稀疏 LU (QR) 分解,然后在 GPU 上并行执行反向代换(分别为 backsub 和矩阵乘法)吗?如果cusolverSp< t >csrlsvlu()对于一个 b_i,是否有一种标准方法可以为多个 b_i 批量执行此操作?

最后,由于我对此没有直觉,考虑到必要的开销,我是否应该期望这些选项中的任何一个在 GPU 上加速? x 的长度约为 10000-100000。谢谢。

最佳答案

我目前正在做类似的事情。我决定基本上将 CUDA SDK 附带的共轭梯度和 0 级不完全 cholesky 预条件共轭梯度求解器实用程序示例包装到一个小类中。

您可以在路径下的 CUDA_HOME 目录中找到它们: samples/7_CUDALibraries/conjugateGradient/Developer/NVIDIA/CUDA-samples/7_CUDALibraries/conjugateGradientPrecond

基本上,您会将矩阵加载到设备内存中一次(对于 ICCG,计算相应的调节器/矩阵分析),然后使用不同的 b vector 调用求解内核。

我不知道你期望你的矩阵能带结构是什么样的,但如果它是对称的并且是对角线主导的(沿着每行和每列的非对角线带与对角线符号相反并且它们的和小于对角线entry)或正定(没有特征值为 0 的特征向量),那么 CG 和 ICCG 应该是有用的。或者,如果您愿意对它们进行编码,则各种多重网格算法是另一种选择。

如果您的矩阵只是半正定矩阵(例如,至少有一个特征值为零的特征向量),您仍然可以使用 CG 或 ICCG,只要您确保: 1) 右侧(b vector )与零空间正交(零空间表示特征值为零的特征向量)。 2) 你得到的解与零空间正交。

有趣的是,如果您确实有一个非平凡的零空间,那么不同的数值求解器可以为您提供相同的精确系统的不同答案。解决方案最终会因零空间的线性组合而有所不同...在我最终理解之前,这个问题已经导致我进行了很多工时的调试和挫折,所以意识到它是件好事。

最后,如果您的矩阵有一个 Circulant Band structure您可能会考虑使用基于快速傅立叶变换 (FFT) 的求解器。基于 FFT 的数值求解器通常可以在适用的情况下产生卓越的性能。

关于c++ - 用于各种 b 的稀疏带状 Ax=b 的批量 CUDA 解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30107988/

相关文章:

C++ 仅使用矩阵按深度排序。可能的?

c++ - 新手与 std::cin 作斗争

r - R 中具有稀疏特征矩阵的大规模回归

python - Numpy 排序数组(稀疏)

c++ - 检查用户定义的文字是否已经被定义

cmake:CUDA 目标的目标特定预处理器定义似乎不起作用

cuda - 设备函数指针

c++ - 定义自定义扫描操作符

c++ - Eigen - 将每个(稀疏)矩阵行除以其对应的对角线元素

c++ - 为什么选择默认模板函数比其专用版本更匹配?