不,根据
OpenMP specification
(OpenMP 3.1版,§2.5工作共享结构):
限制
:
以下限制适用于工作共享构件:
-
团队中的所有线程都必须遇到每个工作共享区域,或者根本没有遇到。
(强调我的)OpenMP 4.0中引入了取消点,这有点改变,但总体思路保持不变。
但既然你在使用
schedule(dynamic)
默认为一次迭代的块大小,您可以改用显式任务:
#pragma omp parallel sections
{
#pragma omp section
{
printf("This is a single thread doing something\n");
}
#pragma omp section
{
for (int i = 0; i < 10; i++)
{
#pragma omp task
{
int thread_id = omp_get_thread_num();
printf("%d-th hello from thread %d\n", i, thread_id);
}
}
}
}
您也可以像在原始代码中那样实现自己的部分,还可以通过使用线程ID来计算迭代范围来重新实现静态调度(如果需要)。