如何在openmp中使用屏障,我很困惑如何工作

时间:2013-12-11 16:13:31

标签: openmp hpc

大家好我正在学习openMP。我使用这个示例代码进行了自我练习。现在,我对输出感到困惑。

#include <omp.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "math.h"

main ()  {

int tid;

int y, z;
int x=0;
int i;

#pragma omp parallel private(tid,i) shared(x,y,z) num_threads(2)
{
    tid = omp_get_thread_num();

    y = 25;
    if(tid==0)
    {
        y = 10;
    }
    else{ z = 89+ tid + 4;}

    printf("befor the barrier y: %d, tid:%d\n", y,tid);

    #pragma omp barrier
    printf("after the barrier y: %d, tid:%d\n", y,tid);

    if(tid==1)
    {
        x = x + y;
        printf("value %d\n", x);
    }
}
}

输出:

befor the barrier y: 10, tid:0
befor the barrier y: 25, tid:1
after the barrier y: 25, tid:0
after the barrier y: 25, tid:1
value 25

在上面的代码和输出中,为什么y值没有从屏障id 0中的25到10更新,在屏障后?我完全糊涂了..有人请你解释一下发生了什么。

由于

1 个答案:

答案 0 :(得分:2)

以下事件序列将产生您看到的输出。

  1. 线程0执行y = 25;
  2. 线程0执行y = 10;
  3. 线程0执行printf("befor the barrier y: %d, tid:%d\n", y,tid);
  4. 主题1执行y = 25;
  5. 主题1执行printf("befor the barrier y: %d, tid:%d\n", y,tid);
  6. 两个线程都退出障碍
  7. 线程0执行printf("after the barrier y: %d, tid:%d\n", y,tid);
  8. 主题1执行printf("after the barrier y: %d, tid:%d\n", y,tid);
  9. 此事件序列与OpenMP的要求不一致。

    屏障确保所有线程在屏障处等待,直到最后一个线程赶上,此时所有线程都可以继续计算。屏障不会影响不同线程上的事件在到达之前的顺序,也不会影响它们离开之后的事件。屏障保证所有线程都在屏障之前执行了所有(它们的代码)代码,但不超过它。