Vb.net 使用Parallel.For加速函数

Vb.net 使用Parallel.For加速函数,vb.net,performance,loops,parallel.for,Vb.net,Performance,Loops,Parallel.for,我已经编写了这个函数,我正在尝试使用Parallel.For或其他方法来加速它。但是,当我将其中一个循环替换为并行。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.Dens

我已经编写了这个函数,我正在尝试使用
Parallel.For
或其他方法来加速它。但是,当我将其中一个循环替换为
并行。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
编辑

这是我与
并行的函数。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

您的实现绝对不是线程安全的。对于(以及大多数并行方法)来说,
并行的一个要求是每个步骤必须是独立的

发件人:

将顺序循环更改为并行循环很容易。然而, 当您不应该使用并行循环时,使用并行循环也很容易。这是 因为很难判断这些步骤是否是独立的 彼此的信任。学习如何识别自己的行为需要练习 步骤依赖于另一个步骤。有时,将此模式用于 带有相依步骤的循环会使程序以完全相同的方式运行 意料之外的方式,也许会停止响应。其他时候,它 引入了一个微妙的错误,它在一百万次运行中只出现一次。在里面 换句话说,“独立”一词是“独立”定义的关键部分 这是一种模式,也是本章详细解释的模式

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


我对矩阵数学的了解还不够,不知道是否有另一个实现可以使线程安全,但你的实现肯定不会工作。

C#或VB.Net?除此之外,谷歌不是色情网站,你可以找到大量的例子。看看这个:你的并行版本的代码是什么样子的?我对线性代数或矩阵不是很精通,所以我可能缺少一些微妙之处,但循环内容似乎相互依赖(许多共享变量,尤其是
S
,和
Y
)。在我看来,它不可并行化。这似乎是一个简单的数学问题。计算机做数学很快。线程的创建速度很慢。所以在多线程上做简单的数学运算是很慢的。坚持一个线程,除非你的矩阵每行和每列有数百或数千个元素。感谢Bradley,我现在已经添加了我的“Parallel.For”代码。我觉得不同的线程正在制造问题,但不确定如何解决它。