Nqueens with openmp c

时间:2011-04-10 05:19:57

标签: c parallel-processing openmp

我用open mp解决n Queens问题,

(最初的八个皇后问题包括试图找到一种方法将八个皇后放在棋盘上,这样任何女王都不会攻击任何其他女王。另一种表达问题的方法是在八个上放八个“任意”通过八个网格,使得它们都不共享一个共同的行,列或对角线。)

如果您查看我尝试使用#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;

}

1 个答案:

答案 0 :(得分:0)

自从上次使用OpenMP以来已经有一段时间了,但我相信private(p),其中p是一个指针(或数组参数)只会生成指针,不是指向的数据,私人。因此阵列本身仍然是共享的。请参阅this question