2017-07-26 92 views
0

我是OpenMP和並行編程的新手,試圖嘗試使用它。我有一個簡單的30個元素的循環,每個元素正在處理一個process()函數。但我故意拖延了一個元素(5th元素)。下面的代碼:Openmp:所有線程在一個線程中因爲延遲而停止

std::mutex mu; 
void print_msg(const char* msg, size_t n) 
{ 
    mu.lock(); 
    cout << msg << n << endl; 
    mu.unlock(); 
} 

void process(size_t i) 
{ 
    print_msg("Processing ... ", i); 

    if (i == 5) // the 5th element is big, so takes time 
     for(int u=0; u<std::numeric_limits<int>::max(); u++); 
} 

int main(int argc, char *argv[]) 
{ 
    #pragma omp parallel 
    { 
     #pragma omp for ordered schedule(dynamic, 3) 
     for(size_t i=0; i<30; i++) 
     { 
      process(i); 
     } 
    } 

    return 0; 
} 

我期待什麼:

已分配的5th元(另2種元素)的線程將得到推遲,但其餘部分將繼續並行。

結果:

下面是提到的延遲位置的結果...

Processing ... 1 
Processing ... 0 
Processing ... 4 
Processing ... 2 
Processing ... 5 
Processing ... 3 
Processing ... 6 
Processing ... 7 
Processing ... 8 
[[ Here the execution paused for a couple of seconds and then 
the below printed out all at once ]] 
Processing ... 9 
Processing ... 11 
Processing ... 12 
Processing ... 13 
Processing ... 10 
Processing ... 14 
Processing ... 15 
Processing ... 16 
Processing ... 17 
Processing ... 21 
Processing ... 20 
Processing ... 19 
Processing ... 18 
Processing ... 22 
Processing ... 24 
Processing ... 23 
Processing ... 26 
Processing ... 27 
Processing ... 25 
Processing ... 29 
Processing ... 28 

所以在我看來,它不僅包含5th元素線程停止,但所有的其他線程也停止了。這是一個正常的行爲?

回答

2

首先,您的線程不是「睡眠」,而是執行所謂的「忙碌等待」,這對於長時間延遲並不是很好(參見例如:What are trade offs for 「busy wait」 vs 「sleep」?)。

但這裏真正的問題似乎是使用

#pragma omp for ordered schedule(dynamic, 3) 

這基本上意味着,該線程將在3組被執行,並且下一組將等待前一個結果(特定的組依次執行)。與dynamic行爲是有點隨機,與static我希望你會看到在組0,1,2和3,4,5之後的停頓 - 在這裏動態的看起來,第三組似乎仍然讓它執行,但是下一組等待線程5完成。

儘量去除omp ordered線,那麼應該允許並行執行的所有線程,因此其他線程不會被線程的執行5.

+0

由於被阻止。這有幫助。 :) –