2011-12-12 26 views
6

私はOpenMP with C++プログラムを持っています。並列領域内には#pragma omp taskを含む平行領域があります。ここでは、実行中のスレッドが満たす条件に応じて並列領域を終了する方法を知りたいと思います。OpenMPで並列領域を条件付きで終了するにはどうすればよいですか?

#pragma omp parallel 
{ 
#pragma omp task 
{ 
    //upon reaching a condition i would like to break out of the parallel region. (all threads should exit this parallel region) 
} 

} 

答えて

5

並列構造を途中で終了することはできません。 OpenMPはこれのための構成を持たず、並列領域には出口点が1つしかないかもしれないと指定しています(領域から分岐しないように...)。

これを達成する唯一の方法は、作業が完了したかどうかを示す変数を持っていて、スレッドがその変数を定期的にチェックする(アトミック命令やフラッシュを使用して正しい可視性を確保する) 。変数が作業が完了したことを示す場合、スレッドは残りの作業をスキップできます(残っている作業は、作業が終了した場合に分岐しないif本体に入れます)。

他のスレッドを中断してブロックの最後に設定するシステム固有のコードを書くことは可能かもしれませんが(スタックや命令ポインタの操作など)、それはあまりお勧めできません非常に脆い)。

あなたが何をしようとしているのか(なぜこれが必要なのか)についてもう少し詳しくお知りになりたい場合は、手助けする方が簡単かもしれません(例えば、これを行う必要のない設計を奨励するなど) 。

関連する問題