2014-03-30 70 views
0

我正在運行到openMP死鎖。由於空間限制,原始代碼相對較長並且很難放在這裏。我列舉了一個代碼結構的例子,它似乎具有相似的結構,並將 運行到類似的問題中。openMP死鎖,同時使用並行區域和一起打開

int main(int argc, char const *argv[]) 
{ 
    #pragma omp parallel 
    { 
     int thread_id = omp_get_thread_num(); 

     if(thread_id>0) 
     { 
      #pragma omp for schedule(dynamic) nowait 
      for (int i = 0; i < 10; ++i) 
      { 
       printf("%dth hello from thread \t: %d\n",i,thread_id); 
      } 
     } 
     else 
     { 
      printf("=========Master thread \t: %d ==============\n",thread_id); 
     } 
      } 

    printf(" +=*+=*+=*+=*+=*+=*+=*+=*+=*+=*+=*\n"); 
    #pragma omp parallel 
    { 
     int thread_id = omp_get_thread_num(); 

     if(thread_id>0) 
     { 
      #pragma omp for schedule(dynamic) nowait 
      for (int i = 0; i < 10; ++i) 
      { 
       printf("%dth hello from thread \t: %d\n",i,thread_id); 
      } 
     } 
     else 
     { 
      printf("=========Master thread \t: %d==============\n ",thread_id); 
     } 
} 

    return 0; 
} 

我打算先用線程做一個計算,而我想利用其他線程併發 的循環中執行並行的OpenMP。代碼在執行openmp並行區域時掛起。如果我在GDB中引入 程序,我會看到以下消息。

Program received signal SIGINT, Interrupt. 
0x000000327c00b5bc in [email protected]@GLIBC_2.3.2() from /lib64/libpthread.so.0 

我需要知道我想要做的事情是否有效和可能。如果是這樣,什麼是可能的工作 圍繞着它的工作。

回答

0

沒有,根據OpenMP specification你在做什麼是無效的(OpenMP的3.1版,§2.5工作分享結構):

限制

以下限制適用於工作分享結構:

  • 每個工作共享區域必須遇到一個團隊中的所有線程或根本沒有。

(重點煤礦)這就改變了OpenMP的4.0位引進的取消點,但總的想法是一樣的。

但因爲你正在使用schedule(dynamic)默認爲一個迭代的塊大小,您可以使用明確的任務,而不是:

#pragma omp parallel sections 
{ 
    #pragma omp section 
    { 
     printf("This is a single thread doing something\n"); 
    } 
    #pragma omp section 
    { 
     for (int i = 0; i < 10; i++) 
     { 
     #pragma omp task 
     { 
      int thread_id = omp_get_thread_num(); 
      printf("%d-th hello from thread %d\n", i, thread_id); 
     } 
     } 
    } 
} 

你也可以實現自己的部分,就像你在你原來的代碼完成你也可以通過使用線程ID來計算迭代範圍來重新實現靜態調度(如有必要)。