当程序执行到达omp sections
指令时,由以下omp section
指令定义的程序段将被分发,以便在可用线程之间并行执行。
原始线程,即在到达omp sections
之前运行的线程,是执行omp section
指令定义的程序段之一的线程之一吗?
在所有线程完成执行由omp section
指令定义的程序段之后,原始线程是否仍然是唯一仍然存在并继续执行的线程?
在下面的示例中,哪个线程是原始线程,1或2还是别的什么?
#pragma omp sections
{
# pragma omp section
{ printf("thread 1 here\n"); }
# pragma omp section
{ printf("thread 2 here\n"); }
}
感谢。
答案 0 :(得分:0)
您的代码示例不完整。让我们天真地完成它。
int main()
{
#pragma omp sections
{
#pragma omp section
{ printf("thread 1 here\n"); }
# pragma omp section
{printf("thread 2 here\n"); }
}
}
这里只有一个帖子。 <{1}}单独创建没有额外的线程。
您在并行构造中使用#pragma omp section
:
sections
相当于
#pragma omp parallel
{
#pragma omp sections
#pragma omp parallel sections
构造创建了一个线程团队。所有线程都运行到parallel
构造,其中每个sections
块将由团队中的一个线程执行。
谈论进入/离开并行部分的线程:
是的,遇到section
构造的线程将成为团队运行的一部分。实际上它将成为线程号为parallel
的主线程。如果团队遇到0
构造,它将参与部分的执行。但是不保证它会执行任何部分,甚至可能没有足够的部分用于所有线程。团队内部分到线程的调度方法是实现定义的。
是的,在sections
区域结束后,原始线程是(唯一)将继续执行外部代码的线程。