我用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;
}
答案 0 :(得分:0)
自从上次使用OpenMP以来已经有一段时间了,但我相信private(p)
,其中p
是一个指针(或数组参数)只会生成指针,不是指向的数据,私人。因此阵列本身仍然是共享的。请参阅this question。