1


1

比較的大きなループに並列化を使用する

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

また、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();
    }

2 Answer


1


  • を呼び出して、負荷分散をフレームワークに任せる 「Partitioner.Create」。

  • ParallelOptionsオブジェクトを作成して、Parallel.Forに渡します。 Try 異なるMaxDegreeOfParallelismで出力し、結果に基づいてコードを調整すると、この数はnoよりも大きくなる可能性があります。 システム内のコアの。 これは私のために働きました。


1


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

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

TPLは、特に負荷分散を提供するように設計されており、その役割を果たします。

ここであなたが心配している主なポイント:

  • 「仕事」は本当に独立しているべきです

  • 「仕事」は自明ではない、すなわち計算集約的であり、 数個の数字を追加するだけではありません

  • 「作業」はI / Oを避ける必要があります(可能な限り)