2017-10-12 27 views
1

当程序执行达到omp sections指令时,将分配以下omp section指令定义的程序段,以便在可用线程之间并行执行。原始线程是否执行由`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"); } 

} 

谢谢。

回答

1

您的代码示例不完整。我们天真地完成它。

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

这里只有一个线程。单独创建#pragma omp section不会创建其他线程。

您使用sections并行构造内:

#pragma omp parallel 
{ 
    #pragma omp sections 

即相当于

#pragma omp parallel sections 

parallel结构创建出一个团队的线程。所有线程运行到sections构造,其中每个section块将由团队中的一个线程执行。

谈到线程进入/离开并行段:

  • 是的,遇到parallel结构的线程将成为球队运转的一部分。事实上,它将成为线程号码为0的主线程。如果团队遇到sections构造,它将参与部分的执行。但不能保证它会执行任何部分,甚至可能没有足够的部分用于所有线程。团队内部分到线程的调度方法是实现定义的。

  • 是的,在parallel区域结束后,原始线程是(唯一的)一个将继续执行外部代码的线程。

+0

谢谢。你如何获得当前线程的线程ID号? – Ben

+0

'omp_get_thread_num()' – Zulan

+0

是否有某种OpenMP旋钮可以扭曲以“鼓励”主人运行其中一个部分?主线程将被暂停(并自愿放弃其CPU片段)以让工作线程运行每个部分,这是不太理想的,因为主线程在并行块的末尾进行连接 – igaz

相关问题