在OpenMP中使用时omp sections
,线程是否会被分配到内部的块中sections,或者将每个线程分配给每个部分?
When nthreads == 3
:
#pragma omp sections
{
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
}
Output:
id=1
id=1
但是当我执行以下代码时:
#pragma omp sections
{
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
}
#pragma omp sections
{
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
}
Output:
id=1
id=1
id=2
id=2
从这些输出中我无法理解 OpenMP 中节的概念。
OP发布的代码永远不会并行执行,因为parallel
没有出现关键字。 OP 的 id 不同于 0 的事实表明他的代码可能嵌入在并行指令中。然而,他的帖子并不清楚这一点,可能会让初学者感到困惑。
最小合理的示例是(对于OP发布的第一个示例):
#pragma omp parallel sections
{
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
#pragma omp section
{
printf ("id = %d, \n", omp_get_thread_num());
}
}
在我的机器上,这打印
id = 0,
id = 1,
显示这两个部分正在由不同的线程执行。
值得注意的是,但是此代码无法提取比两个线程更多的并行性:如果使用更多线程执行它,则其他线程没有任何工作要做,只会闲置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)