使用Parallel.For加速函数

时间:2017-09-20 13:08:14

标签: vb.net performance loops parallel.for

我已编写此功能,我正在尝试使用Parallel.For或其他方式加快速度。但是,当我用Parallel.For替换其中一个循环时,它会给出错误的结果。

Public Function InverseFromUpperTriangular(U As Matrix) As Matrix
    Dim n As Integer = U.RowCount
    Dim Y As Matrix = MathNet.Numerics.LinearAlgebra.Double.Matrix.Build.Dense(n, n)
    Dim S As Matrix = MathNet.Numerics.LinearAlgebra.Double.Matrix.Build.Dense(n, n)
    For j = n - 1 To 0 Step -1
        S(j, j) = 1.0 / U(j, j)
        For i = j To 0 Step -1
            Y(i, j) = (S(i, j) - U.Row(i).SubVector(i, n - i) * Y.Column(j).SubVector(i, n - i)) / U(i, i)
            Y(j, i) = Y(i, j)
        Next
    Next
    Return Y
End Function

编辑

这是Parallel.For

的功能
Public Function InverseFromUpperTriangular(U As Matrix) As Matrix
    Dim n As Integer = U.RowCount
    Dim Y As Matrix = MathNet.Numerics.LinearAlgebra.Double.Matrix.Build.Dense(n, n)
    Dim S As Matrix = MathNet.Numerics.LinearAlgebra.Double.Matrix.Build.Dense(n, n)

    Parallel.For(0, n, Sub(ii)
                           Dim j = n - 1 - ii
                           S(j, j) = 1.0 / U(j, j)
                           For i = j To 0 Step -1
                               Y(i, j) = (S(i, j) - U.Row(i).SubVector(i, n - i) * Y.Column(j).SubVector(i, n - i)) / U(i, i)
                               Y(j, i) = Y(i, j)
                           Next
                       End Sub)

    Return Y
End Function

1 个答案:

答案 0 :(得分:0)

您的实现绝对不是线程安全的。 Parallel.For(以及大多数Parallel方法)的要求之一是每个步骤必须是独立的。

来自MSDN

  

将顺序循环更改为并行循环很容易。然而,   你不应该使用并行循环也很容易。这是   因为很难判断这些步骤是否实际上是独立的   彼此的。学习如何识别一个人需要练习   步骤取决于另一步骤。有时候,在a上使用这种模式   循环与依赖步骤导致程序完全表现   意想不到的方式,也许是停止响应。其他时候,它   引入了一个微妙的错误,只出现在一百万次运行中。在   换句话说,“独立”这个词是定义的关键部分   这个模式,以及本章详细解释的模式。

您有2个外部变量YS,它们都在循环中读取和写入。 For的每个线程都在未知和不可预测的时间访问这些变量。甚至有时候这些变量是由不同核心在同一时间由2个线程同时访问的。在循环的每次迭代中,您无法知道SY所处的状态。

我对矩阵数学知之甚少,不知道你是否还有其他实现,可以使线程安全,但你拥有的那个肯定不会工作。