2011-04-10 20 views
1

我解決N後問題與開放式MP,Nqueens使用OpenMPÇ

(原八個皇后問題包括試圖找到一種方法,將八個皇后在棋盤上,以便沒有王后會攻擊任何其他女王/王后,表達這個問題的另一種方式是在八乘八格上放置八個「任何東西」,以使它們沒有共享一個共同的行,列或對角線)。

如果你看看我試過的代碼使用#pragma omp task但似乎進入永久循環,你將如何使用solve(int Queens[])函數中的omp任務?

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <time.h> 
#include <omp.h> 

#define N 15 
#define MAXThreads 2 

int solutions; 

int put(int Queens[], int row, int column) 
{ 
    int i; 
    //#pragma for schedule(static) 
    for(i=0; i<row; i++) { 
     if (Queens[i] == column || abs(Queens[i]-column) == (row-i)) 
      return -1; 
    } 
    Queens[row]=column; 
    if(row==N-1) { 
     #pragma omp critical 
     { 
     solutions++; 
     }   
    }else{ 
     for(i=0; i<N; i++) { // increment row 
      put(Queens, row+1, i); 
     } 
    } 
return 0; 
} 


void solve(int Queens[]) { 
    int i; 
    #pragma omp parallel private(Queens) num_threads(MAXThreads) 
    { 
//  #pragma omp single 
//  { 
      #pragma omp for schedule(static) 
      for(i=0; i<N; i++) { 
//    #pragma omp task 
       put(Queens, 0, i); 
//    } 
      } 
    } 

} 



int main() 
{ 
    int Queens[N]; 
    time_t t0=0, tf=0,t0s=0,tfs=0;    
//------------------------------------------ 
    t0 = time(NULL); 
//------------------------------------------ 
     //solve_secuencial(Queens); 
    solve(Queens); 
//------------------------------------------ 
    tf = time(NULL); 
//------------------------------------------ 
     printf("# solutions %d time: %f \n",solutions, difftime(tf, t0)); 

return 0; 

} 

回答

0

它已經從去年我使用OpenMP的一段時間,但我相信private(p),其中p是一個指針(或數組參數)只會讓指針,而不是數據被指向的,私有的。所以數組本身仍然是共享的。見this question