2017-04-19 87 views
0

我在使用OpenMP的C代碼中遇到了奇怪的行爲。下面的代碼片段很經常死機:使用OpenMP在C和兩個嵌套循環中崩潰

#define XLEN  (5) 
#define YLEN  (5) 

int do_something(void) 
{ 
    int c,d; 
    double data[YLEN][XLEN]; 

#pragma omp parallel for 

    for(c=0;c<XLEN;c++) 
    { 
     for(d=0;d<YLEN;d++) 
     { 

      /* 
       In the real code here I calculate a result which is a function of c and d, save it in a temporary variable and then write it in the critical section. However this is not necessary for this minimal example. 
      */ 

#pragma omp critical 

      { 
       data[d][c]=0.0f;     
      } 
     } 
    } 

    return 0; 
} 

int main(void) 
{ 
    do_something(); 
} 

我使用的是Mac OS X和我的代碼是使用GCC任(第6版,從MacPorts的)或鏘編譯(版本3.8,也從MacPorts的)。

回答

0

找到發佈之後,d變量應該最外層循環內聲明來解決一分鐘後,在

int do_something(void) 
{ 
    int c; 
    double data[YLEN][XLEN]; 

#pragma omp parallel for 

    for(c=0;c<XLEN;c++) 
    { 
     int d; 

     for(d=0;d<YLEN;d++) 
     { 

等等

+1

現在解釋爲什麼這能解決問題。 –

+0

該變量對於爲最外面的for循環生成的所有併發線程都是相同的,而您想要的是每個線程的不同變量。 – zakk