2

私はpthreadを初めて使用するので、次のような表現方法を尋ねたいと思います。

while(imhappy())
{
 #pragma omp sections
 {
  #pragma omp section
  {
   dothis();
  }
  #pragma omp section
  {
   dothat();
  }
 }
}

fork()またはvfork()を使用する同等の構成で?よろしくお願いします!

PS:リソースのクローン作成のためにループに入る前にフォークする方が賢い場合に備えて、セクションの周りにwhileを含めました。

4

2 に答える 2

2

OpenMPは、単にスレッドを生成するだけでなく、舞台裏で他の多くのことを行います。また、コードセグメントを配布し、さまざまなスレッドを同期します。混乱を招くpthreads実装について質問しているように、質問にタグを付けました。fork()Linuxでは、新しいプロセスを作成し、スレッドの作成に使用されるためfork()、非常に重量があります。clone()

それでも、2つのスレッドを持つOpenMPセクション構成の大まかな同等物はフォークすることであり、その後、if構成が従う必要があり、マスタープロセスがdothis()パスを実行し、子がパスを実行しdothat()ます。からの戻り値fork()は、親プロセスと子プロセスで異なり、ブランチの決定に使用できます。次に、親プロセスは子が終了するのを待ちます。これは、リージョンwaitpid()の最後での暗黙的なバリア同期に類似しています。omp sections

ただし、注意点が1つあります。これfork()は、COW(コピーオンライト)ページを使用して実装されます。つまり、最初は子のメモリコンテンツは親のメモリコンテンツと同じですが、行われた変更はすべて非公開です。子は、親が自分のメモリで変更した内容を確認できず、その逆も同様です。メモリは、SysV共有メモリプリミティブまたは共有ファイルマッピングのいずれかを使用して、2つの間で明示的に共有する必要があります。

代わりにPOSIXスレッドAPIの使用を検討することをお勧めします。

vfork()は完全に異なる目的のために設計されたシステムコールであり、プロセスのクローン作成にはまったく適していません。

于 2012-05-24T11:24:15.800 に答える
0

フォークを使ったセクションのストレートシミュレーションはないと思います。ただし、理論的には、共有変数がルートマシンで保持されるメッセージパッシングメカニズムを使用してシミュレートできます。すべてのopenMPフラッシュは、ルートを使用して行われます。(openMPは弱い整合性モデルよりも弱い整合性モデルを使用することに注意してください)。

于 2012-05-24T17:28:33.347 に答える