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”代码。我觉得不同的线程正在制造问题,但不确定如何解决它。