Nqueens с openmp c - PullRequest
       4

Nqueens с openmp c

1 голос
/ 10 апреля 2011

Я решаю проблему n Queens с открытым mp,

(Первоначальная проблема восьми королев состояла в том, чтобы попытаться найти способ поместить восемь ферзей на шахматную доску, чтобы ни одна королева не напала на любую другую королеву. Альтернативный способ выразить проблему состоит в том, чтобы поместить восемь «чего-либо» на восьмой сеткой, так что ни один из них не разделяет общую строку, столбец или диагональ.)

Если вы посмотрите на код, который я пытался использовать #pragma omp task, но, похоже, он заходит в бесконечный цикл, как бы вы использовали задачу omp в функции solve(int Queens[])?

#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 голосов
/ 10 апреля 2011

Прошло довольно много времени с тех пор, как я в последний раз использовал OpenMP, но я верю, что private(p), где p - указатель (или параметр массива), только сделает указатель , а не данные, на которые указываютк частному.Таким образом, сам массив все еще является общим.См. этот вопрос .

...