5

私はマルチコア プログラミングの初心者ですが、C++ のプログラミング方法は知っています。

現在、マルチコア プログラミング ライブラリを探しています。楽しみのためだけに試してみたいと思います。現在、3 つの API を見つけましたが、どの API を使用すればよいかわかりません。現在、Boost の MPI、OpenMP、および TBB が表示されます。

これら 3 つの API (またはその他の API) のいずれかを使用したことがある方は、これらの違いを教えてください。AMD や Intel のアーキテクチャなど、考慮すべき要素はありますか?

4

5 に答える 5

9

出発点として、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 ディレクティブは、フラグ( -fopenmpgcc 用) を指定して実行した場合にのみ、コンパイラによって認識されます。したがって、同じソース ベースを使用して、シリアル コードとパラレル コードの両方を生成できます。これは、フラグをオフにして、コードのシリアル バージョンから同じ結果が得られるかどうかを確認できることを意味します。こうすることで、アルゴリズムのエラーから並列処理エラーを分離できます。

OpenMP 仕様全体はhttp://www.openmp.org/にあります。

于 2010-05-24T06:15:29.800 に答える
8

内部的には、OpenMP はマルチスレッド プログラミングですが、TBB やその同類よりも高いレベルの抽象化を行っています。マルチコア コンピューターでの並列プログラミングの場合、どちらを選択するかは、同じドメイン内の上位レベルと下位レベルのソフトウェアを選択する場合とほぼ同じです。表現性と制御性の間にはトレードオフがあります。

Intel対AMDは無関係だと思います。

そして、あなたの選択は、あなたが達成しようとしていることに依存するべきです。たとえば、TBB を学びたい場合は、TBB が最適です。しかし、既存の C++ プログラムを簡単な手順で並列化したい場合は、おそらく OpenMP が最初の選択肢として適しています。TBBは、あなたが取り組むために後でまだ存在します. 共有メモリ プログラミング (主にマルチコアで行うこと) から分散メモリ プログラミング (クラスターまたはネットワーク) に移行することが確実でない限り、最初は MPI を避けるでしょう。いつものように、選択するテクノロジーは要件に依存する必要があります。

于 2010-05-23T11:34:16.547 に答える
2

あなたの焦点に依存します。主にマルチスレッドプログラミングに関心がある場合は、TBBを使用してください。プロセスレベルの同時実行性に関心がある場合は、MPIが最適です。

于 2010-05-23T11:10:12.910 に答える
2

しばらく MapReduce で遊んでみることをお勧めします。複数の仮想マシン インスタンスを同じマシンにインストールして、それぞれがHadoopインスタンスを実行できます (Hadoop は MapReduce の Yahoo! オープン ソース実装です)。Hadoop をセットアップするためのオンライン チュートリアルが多数あります。

ところで、MPI と OpenMP は同じものではありません。OpenMP は共有メモリ プログラミング用です。これは通常、複数のマシンでの並列プログラミングではなく、マルチコア プログラミングを意味します。

于 2010-05-23T10:46:39.173 に答える
1

もう 1 つの興味深いライブラリはOpenCLです。基本的に、すべてのハードウェア (CPU、GPU、DSP など) を最適な方法で使用できます。

パフォーマンスを犠牲にすることなく何百ものスレッドを作成できるなど、いくつかの興味深い機能があります。

于 2011-07-20T13:36:53.830 に答える