2014-10-20 62 views
0

我的代碼如下,由於某種原因,我的程序似乎永遠不會退出parallel區域。#pragma omp並行永不結束

我的代碼獲取到

cout<< omp_get_thread_num()<<" done"<< endl; 

線,但它僅有史以來根(0)的過程中執行的,它從不獲取到

cout<<"done2?"<< endl; 

一部分。

這就像它已進入無限循環或什麼。我甚至沒有意識到每個線程都不會在cout之前完成它,因爲我在它之前添加了omp barrier,所以每個線程在根甚至可以說完成之前必須達到它。感謝您的幫助。

#pragma omp parallel num_threads(desiredNumThreads) 
{ 
    double startTime; 
    #pragma omp master 
    { 
     startTime = omp_get_wtime(); 
    }   
    while (!Converged) 
    { 
     #pragma omp master 
     { 
      iteration++; 
     } 
     #pragma omp for 
     for (int i = 0; i < matrixsize; i++) 
     { 
      oldX[i] = newX[i]; 
      //newX[i] = Bmatrix[i]; 
     } 
     #pragma omp for 
     for (int i = 0; i < matrixsize; i++) 
     { 
      newX[i] = Bmatrix[i]; //new part 
      for (int j = 0; j < matrixsize; j++) 
      { 
       if (j != i) 
       { 
        newX[i] = newX[i] - matrix[i][j] * oldX[j]; 
       } 
      } 
      newX[i] = newX[i]/matrix[i][i]; //new part 
     } 
     #pragma omp master 
     { 
      Converged = true; 
     } 
     #pragma omp barrier 
     #pragma omp for 
     for (int i = 0; i<matrixsize; i++) 
     { 
      if (abs(oldX[i] - newX[i]) > Tolerance) 
      { 
       Converged = false; 
      } 
     } 
    } 
    #pragma omp master 
    { 
     double endTime = omp_get_wtime(); 
     cout << "This took " << iteration << " iterations. " << endl; 
     cout << "This took " << endTime - startTime << " seconds" << endl; 
     cout << "File to Print answer to? "; 
     cin >> filename; 
     ofstream fout(filename); 
     for (int i = 0; i < matrixsize; i++) 
     { 
      fout << fixed << newX[i] << endl; 
     }     
    } 
    #pragma omp barrier 
    cout<<omp_get_thread_num()<<" done"<<endl; 
} 
cout<<"done2?"<<endl; 
+0

您是否嘗試過相同的代碼,但沒有OMP?調試OMP代碼要困難得多。確保底層代碼首先給出正確的結果。 – 2014-10-20 06:24:31

+0

是的代碼工作在順序和輸出是正確的並行,它只是永遠不會退出代碼塊後完成雖然 – Spamus 2014-10-20 06:36:45

+0

一些更多的建議:1)'desiredNumThreads'是1時會發生什麼? 2)將'cout <<「Thread」<< omp_get_thread_num()<<「started」<< endl;'添加到塊的開頭。你使用什麼編譯器/操作系統? – 2014-10-20 06:37:16

回答

0

那麼我通過移動最後一節

#pragma omp master 
 
    { 
 
     double endTime = omp_get_wtime(); 
 
     cout << "This took " << iteration << " iterations. " << endl; 
 
     cout << "This took " << endTime - startTime << " seconds" << endl; 
 
     cout << "File to Print answer to? "; 
 
     cin >> filename; 
 
     ofstream fout(filename); 
 
     for (int i = 0; i < matrixsize; i++) 
 
     { 
 
      fout << fixed << newX[i] << endl; 
 
     }     
 
    }

出並行sectio的固定它並順序執行(因爲它已經是連續的)。 爲什麼這解決了我無能爲力的問題。

0

根據MSDN,線程的最大數目是10更改desiredNumThreads至10或更小,它應該工作。

+0

我嘗試過2,10和5,它仍然沒有終止。 :/有趣的是,當我剛纔說32時,它仍然打印出0-31(零索引),當我添加了測試cout <<「Thread」<< omp_get_thread_num()<<「started」<< endl;部分。 – Spamus 2014-10-20 07:14:02

+0

@Spamus處理器看起來像循環一樣繁忙,還是等待?另外,你的意思是說,當你指定一個特定的線程數時,它仍然會啓動32? – 2014-10-20 09:57:50

0

根據註釋,代碼在Debug配置中工作,但不在Release配置中。這表明編譯器正在進行阻止代碼運行的優化。這些優化可能來自我建議閱讀OpenMP內存模型的OpenMP內存模型)。原始代碼中存在一些缺陷(語句中的競爭條件(「Converged = true」))。添加適當的同步將迫使編譯器正確地更新變量Converged並可能使問題消失

乾杯, -Michael

+0

取決於如何聲明'聚合',這可能是答案。我認爲它是共享的,但它可能不是。關於「融合」是共享還是私有的更詳細的信息可以在[這裏]找到(http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg .doc/proguide/cuppvars.htm)(假設編譯器的行爲相似,這可能不是一個安全的假設)。 – 2014-10-20 13:15:30