これは、return 1;
実際return 0;
にはバックトラッキングアルゴリズムを使用した数独ソルバーであるため、並列化しようとしていますが、完全な結果を得ることができません。(私の実装が間違っている場合は修正してください)実際に何が起こりますか?誰か助けてくれませんか?!
これは私が参照しているサイトです。私は彼らのやり方に従っていました: http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/#reply
int solver (int row, int col)
{
int i;
boolean flag = FALSE;
if (outBoard[row][col] == 0)
{
#pragma omp parallel num_threads(2)
#pragma omp parallel for //it works if i remove this line
for (i = 1; i < 10; i++)
{
if (checkExist(row, col, i)) //if not, assign number i to the empty cell
outBoard[row][col] = i;
#pragma omp flush (flag)
if (!flag)
{
if (row == 8 && col == 8)
{
//return 1;
flag = TRUE;
#pragma omp flush (flag)
}
else if (row == 8)
{
if (solver(0, col+1))
{
//return 1;
flag = TRUE;
#pragma omp flush (flag)
}
}
else if (solver(row+1, col))
{
//return 1;
flag = TRUE;
#pragma omp flush (flag)
}
}
}
if (flag) { return 1; }
if (i == 10)
{
if (outBoard[row][col] != inBoardA[row][col])
outBoard[row][col] = 0;
return 0;
}
}
else
{
if (row == 8 && col == 8)
{
return 1;
}
else if (row == 8)
{
if (solver(0,col+1)) return 1;
}
else
{
if (solver(row+1,col)) return 1;
}
return 0;
}
}
5 0 0 0 0 3 7 0 0
7 4 6 1 0 2 3 0 0
0 3 8 0 9 7 5 0 2
9 7 0 4 0 0 2 0 0
0 0 2 0 0 0 4 0 0
0 0 4 0 0 5 0 1 9
4 0 3 2 7 0 9 8 0
0 0 5 3 0 9 6 7 4
0 0 7 5 0 0 0 0 3
Sudoku solved :
5 2 9 8 0 3 7 4 1
7 4 6 1 5 2 3 9 0
1 3 8 0 9 7 5 6 2
9 7 0 4 1 0 2 3 6
0 1 2 9 6 0 4 5 8
3 6 4 7 8 5 0 1 9
4 0 3 2 7 6 9 8 5
2 8 5 3 0 9 6 7 4
6 9 7 5 4 8 1 2 3
//return 1;
は元のシリアル コードです。はreturn
では許可されていないparallel for
ため、以前は#pragma opm flush
削除していましたが、結果は完全ではなく、数独に空のグリッドがいくつか残っていました。
答えてくれてありがとう:>