大家好我正在学习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更新,在屏障后?我完全糊涂了..有人请你解释一下发生了什么。
由于
答案 0 :(得分:2)
以下事件序列将产生您看到的输出。
y = 25;
y = 10;
printf("befor the barrier y: %d, tid:%d\n", y,tid);
y = 25;
printf("befor the barrier y: %d, tid:%d\n", y,tid);
printf("after the barrier y: %d, tid:%d\n", y,tid);
printf("after the barrier y: %d, tid:%d\n", y,tid);
此事件序列与OpenMP的要求不一致。
屏障确保所有线程在屏障处等待,直到最后一个线程赶上,此时所有线程都可以继续计算。屏障不会影响不同线程上的事件在到达之前的顺序,也不会影响它们离开之后的事件。屏障保证所有线程都在屏障之前执行了所有(它们的代码)代码,但不超过它。