Я пытаюсь реализовать решатель n-queens с задачами OpenMP. Тем не менее, игровая доска настроена на основную функцию, и я даю ей функцию.
Пока у меня есть:
bool solve_NQueens(int board[N][N], int col)
{
if (col == N)
{
// #pragma omp critical
// print_solution(board);
#pragma omp critical
SOLUTION_EXISTS = true;
return true;
}
for (int i = 0; i < N; i++)
{
if (can_be_placed(board, i, col))
{
int new_board[N][N];
board[i][col] = 1;
copy(board, new_board);
#pragma omp task firstprivate(col)
solve_NQueens(new_board, col + 1);
board[i][col] = 0;
}
}
return SOLUTION_EXISTS;
}
Первоначальный вызов этой функции в main
:
#pragma omp parallel if(omp_get_num_threads() > 1)
{
#pragma omp single
{
#pragma omp taskgroup
{
solve_NQueens(board, 0);
}
}
}
Параметры:
// these are global
#define N 14
bool SOLUTION_EXISTS = false;
// these are in main
int board[N][N];
memset(board, 0, sizeof(board));
Компилятор:
gcc
Количество потоков: 4
Я использовал taskgroup
, чтобы дождаться выполнения всех заданий, прежде чем получить результат, и мне пришлось скопировать игровое поле. для каждой задачи (это тяжелая работа, когда N
установлен на 14, поскольку существует 356k решений).
Я пытался сделать доску firstprivate
или private
, использовать taskwait
внутри и снаружи из l oop, используйте taskgroup
внутри для l oop и так далее. Мне нужен совет, чтобы оптимизировать этот лог c.
Примечание. Помещение taskgroup
в for l oop в предложении if
также помогает, но это намного медленнее, чем ожидалось.