Parallel processing OpenMP并行段依赖关系

Parallel processing OpenMP并行段依赖关系,parallel-processing,synchronization,openmp,Parallel Processing,Synchronization,Openmp,我遇到了一个我无法解决的非常奇怪的OpenMP问题。这就是它看起来的样子 我有四个功能 function0(Data *data) { ..body.. } function1(Data *data) { ..body.. } function2(Data *data) { ..body.. } function3(Data *data) { ..body.. } 这些函数可以修改或不修改数据所指向的内容 下面是如何按顺序调用它们 // Version 1 void test(Data *d

我遇到了一个我无法解决的非常奇怪的OpenMP问题。这就是它看起来的样子

我有四个功能

function0(Data *data) { ..body.. }
function1(Data *data) { ..body.. }
function2(Data *data) { ..body.. }
function3(Data *data) { ..body.. }
这些函数可以修改或不修改
数据所指向的内容

下面是如何按顺序调用它们

// Version 1

void test(Data *data)
{
    function0(data);
    function1(data);
    function2(data);
    function3(data);
}
我可以按照自己的意愿重新安排通话,而且效果仍然很好。所以我假设他们在某种程度上是独立的

现在当并行化

// Version 2

void test(Data *data)
{
  int th_id;
#pragma omp parallel private(th_id) default(shared)
  {
    th_id = omp_get_thread_num();
    if(th_id==0) {
      function0(data);
    }

    if(th_id==1) {
      function1(data);
      }

    if(th_id==2){
      function2(data);
    }

    if(th_id==3){
      function3(data);
    }
  }
}
它不工作(版本2)

但是,如果我在每次调用后同步线程,它就会工作

// Version 3

void test(Data *data)
{
  int th_id;
#pragma omp parallel private(th_id) default(shared)
  {
    th_id = omp_get_thread_num();
    if(th_id==0) {
      function0(data);
    }
#pragma omp barrier
    if(th_id==1) {
      function1(data);
      }
#pragma omp barrier
    if(th_id==2){
      function2(data);
    }
#pragma omp barrier
    if(th_id==3){
      function3(data);
    }
  }
}
我认为关于
data


但是当我重新安排调用时,为什么它会起作用(在顺序版本1中)

假设有两个这样的函数

function0(int *data)
{
    *data = *data + 1;
}

function1(int *data)
{
    *data = *data + 2;
}
显然,您可以按任意顺序顺序运行这两个操作,并且在结束时,该值将增加3。 但是,如果您并行运行这两个函数,则会出现数据竞争,并且完全有可能丢失其中一个加法,因此您可以获得初始值增加1、2或3的任意值


仅仅因为函数看起来是顺序可交换的,并不意味着它们可以安全地并行运行。

是的。事实证明这就是问题所在。只是函数太大太深,我无法找到问题的根源。我想我必须做一些认真的调试。谢谢