带CUDA的带状稀疏矩阵线性方程求解器

时间:2013-01-16 09:17:04

标签: cuda sparse-matrix linear cublas

我的问题:我有5对角单精度矩阵,尺寸大约为5000x5000(因此那里有大约25000个非零元素)并且必须求解线性方程组。使用“\”运算符时,MATLAB使其持续约1 ms。我尝试用CUDA实现它并遇到以下问题。

首先,CUBLAS无法求解非三角形线性方程,也没有任何分解函数( getrfBatched()除外,它受32x32维度的限制)。好的,我使用了免费版的CULA库并且计算时间太慢,因为这个版本没有带状解算器。

第二,我尝试使用CUSPARSE库。我试过检查共轭梯度法。但事实证明它也很慢,因为它有太多(数百)次迭代(但每个人都非常快,不到1毫秒)。

第三,因为CUSPARSE库有不完整的Cholesky和LU分解函数,我尝试检查预条件共轭梯度法。但它也太慢了,因为* cusparseScsrsv_analysis()* / * cusparseScsrsv_solve()*函数分别需要25和8毫秒。

现在我不知道该怎么办。看来我需要快速带状矩阵求解实现,但我找不到相应的库。可能我没有使用GPU来解决这个问题,而且我的问题有一些CPU优化的库?

2 个答案:

答案 0 :(得分:2)

如果您的时间安排包括数据传输时间,那么GPU计算可能会慢一些。

您可以尝试更多的GPU库。

  • CUSP是用于稀疏矩阵计算的开源GPU库;
  • MAGMA是一个开源GPU线性代数库。
  • ArrayFire是一个GPU科学计算库。

对于CPU lib,我相信这个可能在它提供的所有例程中具有最高性能。事实上,MATLAB将其用作线性代数计算的后端。

  • Intel MKL是用于科学计算的CPU库,包含高性能BLAS / LAPACK /稀疏BLAS /稀疏求解器例程。 MKL是Intel Compilers的一部分,也可以与gcc一起使用。

答案 1 :(得分:1)

我同意这里的爪子。当CPU上的运行时间大约为几百毫秒时,GPU为线性代数提供加速。

也就是说,支持从CULA解决大型带状矩阵。

他们网站上的这个blog post讨论了如何解决带状矩阵。

  

感兴趣的新功能基于LAPACK函数xGBTRF和xPBTRF。这两个例程执行三角形   通用带矩阵和正定矩阵的分解,   分别。一旦分解,这些矩阵可以很容易地解决   xTBTRS和xPBTRS。