0

ネット上の誰かが、次の C# コードは一部の Parallel.for (マルチコア システム用) に変換できないと言いましたが、それは正しいですか? はいの場合、さらに最適化するためのより良い方法はありますか。ありがとう

            for (int i = 0; i < 4; i++)
            {
                var tmp = i;
                tasks[i] = Task.Factory.StartNew(() => Console.WriteLine(tmp));
            }
4

3 に答える 3

1

まあ、あなたはTast.WaitAll(tasks)最後に を持っていないParallel.Forので、あなたは何をしているのかを完全Parallel.Forにはしていません(あなたの質問にそのコードを入れていない限り.もしそうなら、次の行はあなたのコードがどうなるかです. Parallel.For ループのように見える)

Parallel.For(0,4, (i) => Console.WriteLine(i));

それ以外は、Parallel.For に変換できない理由がわかりません。変換できなかった理由は何ですか?

于 2013-02-05T13:40:01.603 に答える
0

外側のループ コードがないので、ここで暗闇の中で突き刺しています。タスクを保存する必要のない全体的な平均ランタイムを測定するだけの場合は、次のようなものを使用して、シリアル バージョンとパラレル バージョンを測定できます。

var iterations = 100;
var stopwatch = new Stopwatch();

// Run Serial version
stopwatch.Start();    
for(int i = 0; i < iterations; i++)
{
    for (int i = 0; i < 4; i++)
    {
        Console.WriteLine(tmp);
    }
}

stopwatch.Stop();
var serialTime = stopwatch.ElapsedMilliseconds;
stopwatch.Reset();

// Run parallel version
stopwatch.Start();

for(int i = 0; i < iterations; i++)
{
    Parallel.For(0,4, (i) => Console.WriteLine(i));    
}

stopwatch.Stop();

var parallelTime = stopwatch.ElapsedMilliseconds;

Console.WriteLine("Serial took  : {0}ms", serialTime / (double)iterations);
Console.WriteLine("Parallel took: {0}ms", parallelTime / (double)iterations);

ワークロードが非常に軽いため、これはスピードアップを測定するための優れたテストではない可能性があります。Thread.Sleepより多くのオーバーヘッドまたはより多くの作業を模倣するようなもので関数を呼び出すことができます。また、C# でアムダールの法則の高速化を測定する方法については、 This StackOverflow Questionの私の回答も参照してください。

于 2013-02-05T21:13:55.080 に答える
0

まず、あなたが報告したエラーについて:

未処理の例外: System.AggregateException: 1 つ以上のエラーが発生しました。System.ArgumentExcpetion: タスク配列に少なくとも 1 つの null 要素パラメーター名が含まれています: Tasks

エラーは非常に明確です。Task.WaitAll呼び出しによって発生します-配列内のタスクスロットの1つtasksがnullであることを示しています。

Console.WriteLine第 2 に、次の 2 つの理由でパフォーマンスを測定するのは良くありません。

  1. ワークロードが軽すぎる: セットアップのオーバーヘッドが実際の作業よりも小さいと推測しています。
  2. Console.WriteLineつまり、すべてのタスクが開始され、すぐに同期されます。これは、map reduce API の使用が絶対に不適切な場合です。代わりに、実際のコンピューティング ワークロードを設計するだけです (素数の計算など)。
于 2013-04-10T07:38:05.267 に答える