使用OMP任务的比赛条件

时间:2019-12-27 19:26:22

标签: c++ parallel-processing task openmp race-condition

具有OMP任务的特定用例。长话短说,某处存在比赛条件,我需要缩小问题范围。没有确切的代码,但是我有一个准系统代码,应该可以传达我想要做的事情的本质。只需要知道我的想法是否正确。这段代码可能不会清除我所看到的争用条件,但可以确认我知道发生了什么。

在我看来,这段代码正在并行运行两个while循环。因此,如果我使用8个线程运行此代码,则其中2个正在运行#pragma omp单循环,其余6个正在运行任务。

此外,当线程= 1时,代码也可以工作。

感谢Fam:)

int tid;
int N = 8;
double D = 0, X = 2, Y = 3, Z = 4;
double * W = WORK ARRAY OF SIZE N; // HELLO PSUEDO CODE.

#pragma omp parallel num_threads(N) {

  #pragma omp single private(tid, ...) nowait {
    while(condition1) {
      if(condition1a) {
        #pragma omp task {
          // Task 1.
          tid = omp_get_thread_num(); 
          #pragma omp critical
          D += W[tid]*X;
        }
      }
    }
  }

  #pragma omp single private(tid, ...) nowait {
    while(condition2) {
      if(condition2a) {
        #pragma omp task {
          // Task 2a.
          tid = omp_get_thread_num();
          #pragma omp critical
          D += W[tid]*Y;
        }
      } else if (condition2b) {
        #pragma omp task {
          // Task 2b.
          tid = omp_get_thread_num();
          #pragma omp critical
          D += W[tid]*Z;
        }
      }
    }
  }

}

0 个答案:

没有答案