クイックソートの順次バージョンと並列バージョンの両方を実装しました。
私の実装では、クイックソートの最悪のケースで高速化を確認するために使用しました。ソース配列は既にソートされており、私の場合、ピボットは常に配列の最初の要素です。
したがって、パーティションは、ピボットよりも小さい要素を含むセットと、ピボットよりも大きい要素を含むセット、つまり n - 1 要素を含む 2 つのセットを生成します。ここで、n は、クイックソート関数の引数として渡される配列の要素の数です。再帰の深さのサイズは N -1 です。N は、クイックソート関数の引数として渡された元の配列の要素の数です。
Obs: セットは実際には、要素がピボットよりも小さいか、要素がピボットよりも高いかのいずれかに対応する、配列部分の初期位置と最終位置を含む 2 つの変数によって表されます。分割全体がその場で行われているため、処理中に新しいアレイが作成されることはありません。並列のシーケンシャルの違いは、並列バージョンでは、要素がそれらの間で均等に分割される複数の配列が作成されることです (シーケンシャル ケースとしてソートされます)。並列の場合の要素の結合には、アルゴリズムのマージが使用されました。
得られたスピードアップは理論値よりも高く、つまり、2 つのスレッドで達成されたスピードアップはシーケンシャル バージョンと比較して 2 倍以上 (より正確には 3 倍) であり、4 スレッドではスピードアップは 10 倍でした。
私がスレッドを実行したコンピューターは、Ubuntu Linux 10.04、64 ビットを実行している 4 コアのマシン (Phenom II X4) です。コンパイラは gcc 4.4 であり、並列実装用のライブラリ pthread を含めることを除いて、コンパイラにフラグは渡されませんでした。
では、超線形の高速化が達成された理由を知っている人はいますか? 誰かが何か指針を教えてもらえますか?