CUDA中非方阵的计算机逆矩阵

时间:2017-02-16 23:28:37

标签: cuda gpu matrix-inverse cublas

我试图在CUDA中找到非方阵的Moore-Penrose伪逆。

今天,我使用以下代码作为Moore-Penrose伪逆的实现。

https://github.com/mathnet/mathnet-numerics/blob/75c3b9fbbfd3fa2def6780179006bde7ca343b08/src/Numerics/LinearAlgebra/Complex/Matrix.cs

问题是我试图找到伪逆的非方矩阵是相当大的,所以我想用CUDA解决它来利用GPU的力量。

我基本上是在寻找此代码的CUDA版本

public static Matrix PseudoInverse(this Matrix M)
    {
        Svd<double> D = M.Svd(true);
        Matrix W = (Matrix)D.W;
        Vector s = (Vector)D.S;


        // The first element of W has the maximum value.
        double tolerance = Precision.EpsilonOf(2) * Math.Max(M.RowCount, M.ColumnCount) * W[0, 0];

        for (int i = 0; i < s.Count; i++)
        {
            if (s[i] < tolerance)
                s[i] = 0;
            else
                s[i] = 1 / s[i];
        }
        W.SetDiagonal(s);

        // (U * W * VT)T is equivalent with V * WT * UT
        return (Matrix)(D.U * W * D.VT).Transpose();

    }
  • 是否有人对CUDA中的Moore-Penrose伪逆实现有任何指示。

任何帮助将不胜感激。

P.S。我想知道使用可部署的GPU解决非方形矩阵的Moore-Penrose伪逆的其他方法。

1 个答案:

答案 0 :(得分:-1)

好的,我使用CUDA的SVD函数实现了Moore-Penrose伪启发

http://docs.nvidia.com/cuda/cusolver/#svd-example1

唯一的问题是CUD版本的SVD比原生MKL版本慢得多!在解决1000 x 1000的矩阵尺寸时,CUDA的SVD功能几乎比MKL库的SVD功能慢4倍。

另一方面,我看到有人声称CULA曾经快得多,但不再受支持了。 CULA仍然在商业上提供,但许可证每年约25,000美元。