Die wichtigsten Neuerungen von OpenMP 4.0

Seite 5: Listing

Inhaltsverzeichnis
void main()
{
/* Sudoku Bord aufsetzen */
#pragma omp parallel
{
#pragma omp single
{
#pragma omp taskgroup
{
solve_parallel(0, 0, sudoku);
}
}
} // end omp parallel
}


void solve_parallel(int x, int y, CSudokuBoard* sudoku, CSudokuBoard*
& solution)
{
if (x == sudoku->getFieldSize()) { // end of line
y++; x = 0;
if(y == sudoku->getFieldSize()) // end
return true;
}

if (sudoku->get(y, x) > 0) { // field already set
return solve_parallel(x+1, y, sudoku); // tackle next field
}

for (int i = 1; i <= sudoku->getFieldSize(); i++) { // try all numbers
if (!sudoku->check(x, y, i)) {
#pragma omp task firstprivate(i,x,y,sudoku)
{
CSudokuBoard* new_sudoku = new CSudokuBoard(*sudoku);
new_sudoku->set(y, x, i); // if number fits, set it
if (solve_parallel(x+1, y, new_sudoku)) { // tackle next field
// remember Sudoku board and stop parallel execution
#pragma omp critical
if (!solution) {
solution = new_sudoku;
#pragma omp cancel taskgroup
}
}
delete new_sudoku;
}
}
}
#pragma omp taskwait

sudoku->set(y, x, 0); // no solution found, reset field
} (ane)