我已编写此功能,我正在尝试使用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
答案 0 :(得分:0)
您的实现绝对不是线程安全的。 Parallel.For
(以及大多数Parallel
方法)的要求之一是每个步骤必须是独立的。
来自MSDN:
将顺序循环更改为并行循环很容易。然而, 你不应该使用并行循环也很容易。这是 因为很难判断这些步骤是否实际上是独立的 彼此的。学习如何识别一个人需要练习 步骤取决于另一步骤。有时候,在a上使用这种模式 循环与依赖步骤导致程序完全表现 意想不到的方式,也许是停止响应。其他时候,它 引入了一个微妙的错误,只出现在一百万次运行中。在 换句话说,“独立”这个词是定义的关键部分 这个模式,以及本章详细解释的模式。
您有2个外部变量Y
和S
,它们都在循环中读取和写入。 For
的每个线程都在未知和不可预测的时间访问这些变量。甚至有时候这些变量是由不同核心在同一时间由2个线程同时访问的。在循环的每次迭代中,您无法知道S
和Y
所处的状态。
我对矩阵数学知之甚少,不知道你是否还有其他实现,可以使线程安全,但你拥有的那个肯定不会工作。