原始线程是否执行`omp section`指令定义的程序段之一?

时间:2017-10-12 13:37:25

标签: c multithreading concurrency openmp

当程序执行到达omp sections指令时,由以下omp section指令定义的程序段将被分发,以便在可用线程之间并行执行。

  • 原始线程,即在到达omp sections之前运行的线程,是执行omp section指令定义的程序段之一的线程之一吗?

    < / LI>
  • 在所有线程完成执行由omp section指令定义的程序段之后,原始线程是否仍然是唯一仍然存在并继续执行的线程?

在下面的示例中,哪个线程是原始线程,1或2还是别的什么?

#pragma omp sections
{

    # pragma omp section
    { printf("thread 1 here\n"); }
    # pragma omp section
    { printf("thread 2 here\n"); }

}

感谢。

1 个答案:

答案 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区域结束后,原始线程是(唯一)将继续执行外部代码的线程。