2012-12-12 52 views
1

我有下面的代碼片段:如何將PLINQ進行並行處理?

// Initialise rectangular matrix with [][] instead of [,] 
double data[][] = new double[m]; 
for (int i = 0; i < m; i++) 
    data[i] = new double[n]; 

// Populate data[][] here... 

// Code to run in parallel: 
for (int i = 0; i < m; i++) 
    data[i] = Process(data[i]); 

如果這是有道理的,我有雙打的矩陣。我需要對矩陣的每一行應用一個轉換。這是「令人尷尬的並行」,因爲從一行到另一行的數據沒有聯繫。

如果我做這樣的事情:

data.AsParallel().ForAll(row => { row = Process[row]; }); 

首先,我不知道是否data.AsParallel()知道只查找第一個下標,或是否會枚舉所有m * n個雙打。其次,由於row是我列舉的元素,我不知道我是否可以像這樣改變它 - 我懷疑不是。

因此,有或沒有PLINQ,在C#中平行循環的好方法是什麼?

回答

4

這裏有兩種方法可以做到這一點:

 data.AsParallel().ForAll(row => 
     { 
      Process(row); 
     }); 

     Parallel.For(0, data.Length, rowIndex => 
     { 
      Process(data[rowIndex]); 
     }); 

在兩種情況下,雙精度的一維陣列通過引用傳遞並在工藝方法將修改的數據數組修改值。