2017-09-20 49 views
-1

我寫了這個功能,我試圖用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 
+0

C#或VB.Net?除此之外,谷歌並不是色情的,你可以找到大量的例子。看看這個:https://msdn.microsoft.com/de-de/library/dd460713(v=vs.110).aspx – muffi

+1

你的水貨版本的代碼是什麼樣的? –

+4

我對線性代數或矩陣不太熟悉,所以我可能會遺漏一些微妙之處,但循環內容似乎相互依賴(很多共享變量,尤其是'S'和'Y'') )。它看起來並不是我可以並行的。 –

回答

0

你實現絕對不是線程安全的功能。 Parallel.For(和大多數Parallel方法)的要求之一是每個步驟必須是獨立的。

MSDN

可以很容易地改變順序循環成並行循環。但是,如果不這樣做,使用並行循環也很容易。這是 ,因爲可能很難判斷這些步驟實際上是否是彼此獨立的 。需要練習來學習如何識別一個步驟是否依賴於另一個步驟。有時,在具有相關步驟的 循環中使用此模式會導致程序以意外的方式完全行爲,並且可能會停止響應。其他時候,它會引入一個微妙的錯誤,僅在百萬次運行中出現一次。在 中,「獨立」這個詞是 這個模式的定義的關鍵部分,本章將詳細解釋。

你有2個外部變量,Y,並且S,那都是讀取和寫入,內環路。 For的每個線程都在未知和不可預知的時間訪問這些變量。甚至有些時候,這些變量可以同時由兩個線程同時訪問不同的內核。無法知道SY在循環的每次迭代中所處的狀態。

我對矩陣數學知之甚少,不知道是否有另一個實現你正在嘗試做的事情,可能可以做成線程安全的,但是你擁有的那個絕對不行。