У меня есть список заданий, которые я обрабатываю параллельно с OpenMP:
void processAllJobs()
{
#pragma omp parallel for
for(int i = 0; i < n; ++i)
processJob(i);
}
Все задания имеют несколько последовательных частей и частей, которые можно распараллелить, если вызывать их по отдельности:
void processJob(int i)
{
for(int iteration = 0; iteration < iterationCount; ++iteration)
{
doSomePreparation(i);
std::vector<Subtask> subtasks = getSubtasks(i);
#pragma omp parallel for
for(int j = 0; j < substasks.size(); ++j)
subtasks[j].Process();
doSomePostProcessing(i)
}
}
Когда я запускаю processAllJobs()
, потоки создаются для внешнего цикла (по каждому заданию), а внутренний цикл (по подзадачам) выполняется последовательно внутри потока.Это все хорошо и предназначено.
Иногда есть очень большие задания, которые требуют много времени для обработки.Достаточно долго, чтобы все остальные потоки во внешнем цикле уже заканчивали работу до последнего потока и ничего не делали.Есть ли способ переназначить неиспользуемые потоки для распараллеливания внутреннего цикла, как только они закончатся?Я представляю что-то, что проверяет количество неиспользуемых потоков каждый раз, когда вводится внутренняя параллельная область.
Я не могу предсказать, как долго выполняется задание.Это может быть не только одна длительная работа - может быть, две или три.