尽管有关键部分,但对输出进行了重新排序

时间:2018-11-02 00:45:48

标签: c openmp

我正在尝试使用OpenMp将此Pascal三角形程序修改为并行程序。我使用了for指令来并行化printPas函数的循环,并将条件语句放在关键部分的内部,以便一次只能打印一个线程,但是看来我仍然在一场数据竞赛,因为我的输出确实不一致。

#include <stdio.h>

#ifndef N
#define N 2
#endif
unsigned int t1[2*N+1], t2[2*N+1];
unsigned int *e=t1, *r=t2;
int l = 0;

//the problem is here in this function
void printPas() {
  #pragma omp parallel for private(l)
  for (l=0; l<2*N+1; l++) {
    #pragma omp critical
    if (e[l]==0)
      printf("      ");
    else
      printf("%6u", e[l]);
  }
  printf("\n");

}

void update() {
  r[0] = e[1];
#pragma omp parallel for
  for (int u=1; u<2*N; u++)
    r[u] = e[u-1]+e[u+1];
  r[2*N] = e[2*N-1];
  unsigned int *tmp = e; e=r; r=tmp; 
}

int main() {
  e[N] = 1;
  for (int i=0; i<N; i++) {
    printPas();
    update();
  }
  printPas();
}

1 个答案:

答案 0 :(得分:3)

您的关键部分导致打印顺序运行。因此,使用“关键”代码所需的时间比不尝试并行化的时间要长。

使用不同的线程进行打印,您不知道哪个线程将首先访问关键部分。因此,for循环将不会按照您希望的顺序执行。

我建议要么删除并行指令(“ #pragma omp parallel for private(l)”),要么删除“关键”并接受每次打印都会以不同的顺序出现。