2017-02-20 93 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()系統調用,那麼操作系統知道線程處於空閒狀態,並且應該將另一個線程安排到該邏輯CPU上,這正是您想要的。

+0

我想我現在明白了,在閱讀OpenMP任務時我很困惑,因爲他們特意聲明對計劃程序事件做出反應,我認爲其他構造函數可能不會。但它看起來像任務使用另一個建立在OS之上的調度器。這看起來正確嗎? – jayjay

+1

是的,或多或少。 OpenMP任務是將工作分配到OpenMP控制的線程的一種方式,因此可以遷移到OpenMP線程,否則OpenMP線程不會執行OpenMP工作(通常是在某種障礙處等待的線程)。這一切都沒有比邏輯CPU更多的OpenMP線程,並且沒有與操作系統調度程序進行任何交互。 –