私は既に何らかの並列処理のために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();
}
}
私は今、OpenMPタスクについて読んだときに混乱していたと思っています。スケジューライベントに反応するよう具体的に述べられているので、私は他の構成がそうではないと考えました。しかし、タスクはOSの上に構築された別のスケジューラを使用するように見えます。これは正しいようですか? – jayjay
はい、多かれ少なかれ。 OpenMPタスクは、OpenMPが制御するスレッドに作業を配布する方法であるため、実行するOpenMPの作業がないOpenMPスレッド(通常は何らかの障壁を待っているスレッド)に移行できます。これは、論理CPUよりも多くのOpenMPスレッドを持たずに、オペレーティングシステムスケジューラとのやりとりがなくても起こります。 –