Linuxを使用してCでマルチスレッドアプリケーションを作成しています。
POSIXスレッドAPIを使用すべきか、OpenMP APIを使用すべきかわからない。
どちらを使用する場合の長所と短所は何ですか?
編集:
両方のAPIがkernel-levelまたはser-levelスレッドを作成するかどうかを誰かが明確にできますか?
PthreadとOpenMPは、まったく異なる2つのマルチプロセッシングパラダイムを表しています。
Pthreads は、スレッドを操作するための非常に低レベルのAPIです。したがって、スレッド管理(create/join/etc)、ミューテックスなどを非常にきめ細かく制御できます。それはかなり必要最低限です。
一方、 OpenMP はmuchより高いレベルであり、より移植性が高く、Cの使用に制限されません。また、pthreadsよりもはるかに簡単にスケーリングできます。この具体例の1つは、OpenMPのワークシェアリング構造です。これにより、比較的簡単に複数のスレッドに作業を分割できます。 (ウィキペディアの 賛否両論リスト も参照してください。)
ただし、実装している特定のプログラム、またはその使用方法の詳細については実際には提供していないため、あるAPIを他のAPIよりも推奨することはかなり不可能です。
OpenMPを使用する場合、canは単一のプラグマを追加するのと同じくらい簡単で、線形高速化で適切にマルチスレッドコードを作成する方法の90%になります。 pthreadで同じパフォーマンスを得るには、さらに多くの作業が必要です。
しかし、いつものように、pthreadを使用すると柔軟性が高まります。
基本的に、アプリケーションによって異なります。自明な並列化可能なアルゴリズムはありますか?または、同時にやりたい任意のタスクがたくさんありますか?タスクは相互にどの程度対話する必要がありますか?どのくらいの同期が必要ですか?
OpenMPには、クロスプラットフォームであり、一部の操作が簡単であるという利点があります。次のようなループの並列化など、より高いレベルのスレッドオプションを提供するという点で、スレッドは異なる方法で処理されます。
#pragma omp parallel for
for (i = 0; i < 500; i++)
arr[i] = 2 * i;
これに興味があり、C++がオプションの場合は、 Threading Building Blocks もお勧めします。
Pthreadsは、スレッドと同期を明示的に生成するための低レベルAPIです。その点で、より多くの制御を提供します。
それは、コードベースとその中の場所という2つのことに依存します。重要な質問は次のとおりです。1)「コードベースにはスレッド、スレッドプール、およびコントロールプリミティブ(ロック、イベントなど)がありますか?」および2)「再利用可能なライブラリまたは通常のアプリを開発していますか?」
ライブラリにスレッドツールがある場合(ほとんどの場合、PThreadのフレーバーに基づいて構築されます)、これらを使用します。あなたがライブラリ開発者である場合、それらを構築するために(可能であれば)時間を費やしてください。 OpenMPが提供するよりもはるかにきめ細かく高度なスレッド化を組み合わせることができます。
逆に、時間に追われたり、アプリやサードパーティ製のツール以外のものを開発したりする場合は、OpenMPを使用してください。いくつかのマクロでラップし、必要な基本的な並列処理を取得できます。
一般的に、OpenMPは基本的なマルチスレッド化に十分です。高度に非同期なコードを構築する上で直接リソースを使用してシステムを管理しているという点に到達すると、その使いやすさの利点は、パフォーマンスとインターフェイスの問題でいっぱいになります。