我有一个稀疏的带矩阵A,我想(直接)求解ax = b。我有大约500个向量B,所以我想解决相应的500 X。我对Cuda来说是崭新的,所以我对可用的选择有些困惑。
cusolver在此处使用QR具有稀疏a_i x_i = b_i的批处理直接求解器cusolversp。(因为A的条件很正常,我也可以很好地对Lu。)但是,据我所知,我无法利用我所有的A_I都是相同的事实。
另一种选择是首先确定CPU或GPU上的稀疏LU(QR)分解,然后在GPU上平行执行后订单(分别为BackSub和Matrix Mult)?如果Cusolversp<t> csrlsvlu()适用于一个b_i,是否有一种标准方法可以批量进行此操作,以执行多个B_I的操作?
最后,由于我对此没有直觉,因此,如果必要的开销,我应该期望这两个选项上的GPU加速吗?X长度〜10000-100000。谢谢。
我目前正在研究类似的事情。我决定基本上将共轭梯度和0级不完整的Cholesky预处理共轭梯度求解器实用程序样品(与CUDA SDK一起使用)。
您可以在路径下的cuda_home目录中找到它们: samples/7_CUDALibraries/conjugateGradient
和/Developer/NVIDIA/CUDA-samples/7_CUDALibraries/conjugateGradientPrecond
基本上,您将矩阵加载到设备存储器中一次(对于ICCG,计算相应的护发素/矩阵分析),然后用不同的B向量调用溶液内核。
我不知道您的矩阵谱带结构会是什么样输入)或正定义(没有特征值为0的特征向量。)CG和ICCG应该有用。或者,如果您愿意对其进行编码,则各种Multigrid算法是另一种选择。
如果您的矩阵仅是正半决次(例如,至少具有一个特征值为零的特征向量),那么只要您确保以下时间:1)右侧(B向量)与空空间(无空间含量为零)正交(含量为零)。2)您获得的解决方案与空空间正交。
有趣的是,如果您确实有一个非平凡的空空间,那么不同的数字求解器可以为相同的精确系统提供不同的答案。解决方案最终会因无效空间的线性组合而有所不同……这个问题使我在我最终陷入困境之前给我带来了许多小时的调试和挫败感,因此很高兴意识到它。
。最后,如果您的矩阵具有循环频带结构,则可以考虑使用基于快速的傅立叶变换(FFT)求解器。在适用的情况下,基于FFT的数值求解器通常可以产生出色的性能。
是否有一种标准方法可以对多个B_I进行此操作?
一个选项是在Cuda的Cusolver中使用批处理的重构模块,但我不确定它是否是 standard 。
Cusolver中的批处理重构模块提供了一种有效的方法来求解具有固定左侧稀疏矩阵的线性系统的批次(或具有固定稀疏模式但系数变化的矩阵)和基于LU分解的右侧变化的方法。与之相关的官方文档(从CUDA 10.1开始)中只能找到一些部分完成的代码段。可以在此处找到一个完整的示例。
如果您不介意使用开源库,也可以查看cusp:尖端快速开始页
它具有相当不错的求解器套件,包括一些预处理的方法:尖端预处理示例
只要您的gpu在板载内存足够的内存中,
平滑的聚合预处理器(代数多机的变体)似乎可以工作。