2017-02-20 8 views
0

私は既に何らかの並列処理のためにOpenMPを使用していますが、ブロッキング受信で制御スレッドを追加したいと考えています。ほとんどの場合、このスレッドはブロックされますので、コアになって座っていないようにします。理想的には、ブロッキング呼び出しは余分なワーカースレッドへの利回りをトリガーします。 OpenMPがブロッキングコールをどのように処理しますか?このようなスレッド内のOpenMPブロッキングコール

何か:

#include <omp.h> 

int main() 
{ 
int cores = omp_get_num_procs(); 
#pragma omp parallel num_threads(cores + 1) 
    if (omp_get_thread_num() == 0) { 
     send(); 
     blockingReceive(); 
    } 
    else 
    { 
     work(); 
    } 
} 

答えて

1

これは標準については、確かに、そうでもないのOpenMPについての質問ではない、または。一般に、OpenMPの実装では、blockingReceive()を実行しているスレッドがブロックされていることを認識していることはほとんどありません。コンパイル時にブロックできることを簡単に検出できず、コール。

代わりに、論理CPUより多くのスレッド(オーバーサブスクリプション)がある場合、オペレーティングシステムがスレッドをスケジュールする方法に関する質問です。 blockingReceive()がブロッキングread()システムコールに変わったと仮定すると、OSはスレッドがアイドル状態であることを知り、別のスレッドをその論理CPUにスケジュールする必要があります。

+0

私は今、OpenMPタスクについて読んだときに混乱していたと思っています。スケジューライベントに反応するよう具体的に述べられているので、私は他の構成がそうではないと考えました。しかし、タスクはOSの上に構築された別のスケジューラを使用するように見えます。これは正しいようですか? – jayjay

+1

はい、多かれ少なかれ。 OpenMPタスクは、OpenMPが制御するスレッドに作業を配布する方法であるため、実行するOpenMPの作業がないOpenMPスレッド(通常は何らかの障壁を待っているスレッド)に移行できます。これは、論理CPUよりも多くのOpenMPスレッドを持たずに、オペレーティングシステムスケジューラとのやりとりがなくても起こります。 –

関連する問題