您对问题的描述听起来更像是OpenMP任务将是一个更好的选择。您的代码如下所示:
void processAllJobs()
{
#pragma omp parallel master
for(int i = 0; i < n; ++i)
#pragma omp task
processJob(i);
}
然后该作业的处理过程如下所示:
void processJob(int i)
{
for(int iteration = 0; iteration < iterationCount; ++iteration)
{
doSomePreparation(i);
std::vector<Subtask> subtasks = getSubtasks(i);
#pragma omp taskloop // add grainsize() clause, if Process() is very short
for(int j = 0; j < substasks.size(); ++j)
subtasks[j].Process();
doSomePostProcessing(i)
}
}
这样,您就可以获得自然的负载平衡(假设您有足够的任务),而不必依赖嵌套的并行性。