【发布时间】:2020-03-03 20:55:22
【问题描述】:
我正在尝试使用 OpenMP 实现一个 nqueens 求解器,我的串行代码工作正常,但是当我尝试对其执行任务并行时,我得到分段错误或空行/列。
这是我的实现:
#define N 8
bool SOLUTION_EXISTS = false; // THIS IS GLOBAL
bool solve_NQueens(int board[N][N], int col)
{
if (col == N)
{
#pragma omp critical
print_solution(board);
SOLUTION_EXISTS = true;
return true;
}
for (int i = 0; i < N; i++)
{
if (can_be_placed(board, i, col) )
{
#pragma omp taskgroup
{
#pragma omp task private(col) shared(i) firstprivate(board)
{
board[i][col] = 1;
SOLUTION_EXISTS = solve_NQueens(board, col + 1) || SOLUTION_EXISTS;
board[i][col] = 0;
}
}
}
}
return SOLUTION_EXISTS;
}
第一次调用这个函数是:
#pragma omp parallel
{
#pragma omp single
{
solve_NQueens(board, 0);
}
}
当我将 col 设为私有时,它会出现分段错误。如果我没有放置任何变量范围,则会打印出模棱两可和错误的解决方案。
我正在使用gcc 4.8.5
【问题讨论】:
-
全局变量通常会出现问题,尤其是递归函数和/或线程/并行性。两者结合——哎哟!我不知道 OMP,所以也许我根本不应该发表评论,但在我看来,如果共享状态过多,您会遇到各种问题。
标签: c parallel-processing openmp multitasking