3

学校では、マルチスレッド アプリケーションを作成するタスクがありました。マージソートのマルチスレッド実装を選択しました。

ただし、シリアル実装よりも高速に動作させることはできません。

私はすでに次のことを試しました:

  • 無制限のスレッドを使用した実装 (コード例 1) (非常に遅かった)
  • 限られたスレッドでの実装 (コード例 2) (最大 4 スレッド - それでも非常に遅い)
  • Parallel.Invoke を使用した実装 (コード例 3) (さらに遅い)
  • 並列マージ機能も備えた複雑な実装(恥ずべきほど遅い)

Visual Studio (インストルメンテーション部分) で分析ツールを使用すると、呼び出される関数のタイミングがわかり、スレッド化されたソリューションは常にシリアル実装よりも非常に遅くなります。

これには考えられる理由が見当たりません。

(例: 5000000 の数字を並べ替える; シリアル実装: 16.717,17; パラレル: 20.259,97; スレッドが 1 つ増えるだけの結果)

私が所有する両方のマシンでテストしました:

  • インテル コア 2 クアッド Q9450 @ 2.66Ghz
  • インテル コア i7 Q720 @1.60Ghz

どうすればこれが可能になるのか、一生わからないのですが、プロセスをスピードアップするだけでよいのではないでしょうか?

誰かが私を助けることができれば、私は本当に素晴らしいと思います.

コード例 1:

ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
Thread thread = new Thread(new ThreadStart(pMerge.parallel_merge));
thread.Start();

ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
pMerge2.parallel_merge();
thread.Join();

コード例 2:

if(depthRemaining > 0)
{
   ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
   thread thread = new Thread(new ThreadStart(pMerge.parallel_merge));
   thread.Start();
   ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
   pMerge2.parallel_merge(); 
   thread.Join();
}
else
{
   ParallelMerge pMerge = new ParallelMerge(T, p1, q1 -1, p2, q2-1, A, p3);
   pMerge.parallel_merge(); 
   ParallelMerge pMerge2 = new ParallelMerge(T, q1 + 1, r1, q2, r2, A, q3 + 1);
   pMerge.parallel_merge(); 
}

コード例 3:

if (depthRemaining > 0)
{
   Parallel.Invoke(
      () => threaded_merge_sort(getallen, p, q, depthRemaining-1));

   threaded_merge_sort(getallen, q + 1, r, 0);
}
else
{
   threaded_merge_sort(getallen, p, q, 0);
   threaded_merge_sort(getallen, q+1, r, 0);
}
4

2 に答える 2

2

どの時間単位で報告していますか?

新しいスレッドの開始は「遅い」操作です。マルチスレッドを使用した非常に短いリストのソート/マージは、少し遅くなる可能性があります。

数値リストの長さを半分に分割すると、プログラムの実行速度は速くなりますか? そうでない場合、コードは単純にスケーリングしません。

実際のコード実装なしでこの質問に答えるのは少し難しいです。

于 2012-05-14T09:06:41.923 に答える
0

問題はコードではなく、VS の分析ツールにあったようです。

-アルネ・クレアバウト

于 2012-10-23T19:03:45.200 に答える