2012-04-04 5 views
0

ランダム変数を使用して正規分布を生成するWpfコードを書きました。C#でParallel.forが動作していません

using System.Threading.Tasks; 
using System.Threading; 


private void Button_Click(object sender, RoutedEventArgs e) 
     {   ..... 


for (int t = 0; t < normalx.Count; t++) 
      { 
       normaly.Insert(t, (2/((Math.Pow(2 * Math.PI, 0.5)) * rmsnormalvalue)) * Math.Exp(-0.5 * Math.Pow(standardnormalx.ElementAt(t), 2))); 
      } 

... 


} 

これはシントンコードです。並列スレッドとして実行するには

は、私が

Parallel.For(0, normalx.Count, t => 
      { 
       normaly.Insert(t, (2/((Math.Pow(2 * Math.PI, 0.5)) * rmsnormalvalue)) * Math.Exp(-0.5 * Math.Pow(standardnormalx.ElementAt(t), 2))); 
      }); 

にこれを変更したが、ビルドは大丈夫ですが、実行時に一つだけのスレッド域(normalx.Count/8 < - 私のPCはi7のである)で

ました作業し、計算した。

どうしたのですか?

+2

「normaly」とは何ですか?スレッドセーフですか? –

答えて

1

TPLは、並列ループに特定のスレッド数を使用することを保証しません。それは可能ですが、追加のスレッドを開始するオーバーヘッドは、ループ内で実行される作業の量があまりにも多く、単一のスレッドで実行するだけであると判断する可能性があります。

http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx

が並列を実行することができる反復ループの実行します。

(強調鉱山)

あなたカスタムパーティショナを提供することによって、(強制的に良いアイデアは、必ずしもではないこと)、私はまだ

ことを試していないが、複数のスレッドを強制することができるかもしれ

http://msdn.microsoft.com/en-us/library/dd560853.aspx

TPLは、「あなたがカスタムパーティショナーを提供してくれていいですが、まだ1つのスレッドで各パーティションを順番に実行しようとしています。私は現在の実装がその点でどのように動作するのか分かりません。

UPDATE

再読み込みとヘンクのコメントを確認し、私は私が正しく初めてあなたの質問を読んでわかりません。

法線の一部しか計算されていないと言っていますか?その場合は、normalyを裏付けるコレクションがスレッドセーフではないからです。

これが当てはまる場合は、計算を行い、一時変数に代入してから、実際の挿入の周りにlockを使用します。これにより、コレクションにボトルネックが挿入されますが、計算の並列性は引き続き得られます。

+0

それは入出力の領域を変更するでしょうか? –

+0

@Henk:私は疑問を誤解しているかもしれません。私の答えを更新しました。 –

0

ほとんどの場合、normaly.Insert(t, ...)はスレッドセーフではなく、実行したい操作でもありません。あなたがしたいのは、必要なすべてのスロットで空のデータ構造を作成してから、並列ループでそれらを埋めることです。どのようにすればいいのですか?

var temp = new double[normalx.Count]; 
Parallel.For(0, normalx.Count, t => 
    temp[t] = 2/((Math.Pow(2 * Math.PI, 0.5)) * rmsnormalvalue)) * 
       Math.Exp(-0.5 * Math.Pow(standardnormalx.ElementAt(t), 2)); 
normaly = temp.ToList(); 
関連する問題