学校では、マルチスレッド アプリケーションを作成するタスクがありました。マージソートのマルチスレッド実装を選択しました。
ただし、シリアル実装よりも高速に動作させることはできません。
私はすでに次のことを試しました:
- 無制限のスレッドを使用した実装 (コード例 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);
}