1

8 GB メモリを搭載した 8 コア CPU マシンを使用しています。論理的には、次のコードは並列で実行できますが、ループのサイズよりも使用可能なコアがはるかに少ないため、ループは並列処理の機会を十分に提供します。次に、すべてのデリゲート式は、自由変数を保持するためにいくらかのメモリを割り当てます。この場合、parallel for を使用することをお勧めしますか?

また、この場合、2 つの並列 for を 2 つのタスクに分離すると、パフォーマンスが向上しますか??

     private static void DoWork()
    {

        int end1 = 100; // minimum of 100 values; 
        int end2 = 100; // minimum of 100 values;


        Task a = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end1, delegate(int i)
                {
                    // independent work                     
                });
            }
        );

        Task b = Task.Factory.StartNew(
            delegate
            {
                Parallel.For(0, end2, delegate(int i)
                {
                    // independent work                        
                });
            }
        );

        a.Wait();
        b.Wait();         
    }
4

2 に答える 2

1
  • 「Partitioner.Create」を呼び出して、負荷分散をフレームワークに任せます。
  • ParallelOptions オブジェクトを作成して、Parallel.For に渡してみてください。さまざまな MaxDegreeOfParallelism を試して、結果に基づいてコードを調整してください。この数は、いいえよりも大きくなる可能性があります。システム内のコアの数。これは私にとってはうまくいきました。
于 2010-10-16T09:25:59.460 に答える
1

また、この場合、2 つの並列 for を 2 つのタスクに分離すると、パフォーマンスが向上しますか??

目立たず、パフォーマンスを簡単に損なう可能性があります。

TPL は特に負荷分散を提供するように設計されており、その仕事を任せてください。

ここでの主なポイントは次のとおりです。

  • 「仕事」は本当に独立しているべきです
  • 「仕事」は自明ではない、つまり、計算集約的で、いくつかの数値を追加するだけではありません。
  • 「作業」は I/O を避ける必要があります (可能な限り)
于 2010-10-16T09:30:40.813 に答える