У меня есть две задачи, которые сначала должны выполняться одновременно:
1) для цикла, который можно распараллелить
2) функция, которая может выполняться с одним потоком
Теперь позвольте мне описать, что я хочу сделать.
Если существует 8 доступных потоков,
job (1) и job (2) сначала должны одновременно запустить с 7 потоками и 1 потоком соответственно.
После завершения задания (2) поток, который использовал задание (2), должен быть назначен заданию (1), которое является параллельным циклу for.
Я использую omp_get_thread_num , чтобы подсчитать, сколько потоков активно в каждом регионе.Я ожидаю, что число потоков в job(1)
увеличивается на 1, когда job(2)
заканчивается.
Ниже описывается решение, которое может быть неправильным или нормальным:
omp_set_nested(1);
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section // job(2)
{ // 'printf' is not real job. It is just used for simplicity.
printf("i'm single: %d\n", omp_get_thread_num());
}
#pragma omp section // job(1)
{
#pragma omp parallel for schedule(dynamic, 32)
for (int i = 0 ; i < 10000000; ++i) {
// 'printf' is not real job. It is just used for simplicity.
printf("%d\n", omp_get_thread_num());
}
}
}
}
Как можно сделатьработа, которую я хочу достичь, будет выполнена?