出発点として、OpenMP をお勧めします。これにより、ループ、セクション、およびタスクという 3 つの基本的な並列処理を非常に簡単に行うことができます。
並列ループ
これらにより、ループの繰り返しを複数のスレッドに分割できます。例えば:
#pragma omp parallel for
for (int i=0; i<N; i++) {...}
2 つのスレッドを使用していた場合、最初のスレッドが反復の前半を実行します。2 番目のスレッドは後半を実行します。
セクション
これらにより、作業を複数のスレッドに静的に分割できます。これは、並行して実行できる明らかな作業がある場合に役立ちます。ただし、これはあまり柔軟なアプローチではありません。
#pragma omp parallel sections
{
#pragma omp section
{...}
#pragma omp section
{...}
}
タスク
タスクは最も柔軟なアプローチです。これらは動的に作成され、それらを作成したスレッドまたは別のスレッドによって非同期で実行されます。
#pragma omp task
{...}
利点
OpenMP にはいくつかの機能があります。
ディレクティブ ベース:コンパイラは、スレッドの作成と同期の作業を行います。
段階的な並列処理: 並列処理が必要なコードの領域だけに集中できます。
シリアル コードとパラレル コードの 1 つのソース ベース: OpenMP ディレクティブは、フラグ( -fopenmp
gcc 用) を指定して実行した場合にのみ、コンパイラによって認識されます。したがって、同じソース ベースを使用して、シリアル コードとパラレル コードの両方を生成できます。これは、フラグをオフにして、コードのシリアル バージョンから同じ結果が得られるかどうかを確認できることを意味します。こうすることで、アルゴリズムのエラーから並列処理エラーを分離できます。
OpenMP 仕様全体はhttp://www.openmp.org/にあります。