OpenMP任务依赖项到线程专用存储

时间:2016-10-06 06:02:25

标签: multithreading task buffer openmp

考虑以下示例,OpenMP要求必须确定buff1buff2中存储的地址。但是,buff1buff2中存储的地址是根据运行任务的线程的id(myid)确定的。我怎样才能解决我的问题?任何解决方案都很受欢我不被允许分配内存。

mystruct* buff1;
mystruct* buff2;
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0])
{
  int myid=omp_get_thread_num();
  buff1=buffers[myid];
  processA(data, buff1);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2[0:0])
{
  int myid=omp_get_thread_num();
  buff2=buffers[myid];
  processB(data, buff2);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1[0:0])  depend(inout: buff2[0:0])
{
  processC(data, buff1, buff2);
}

1 个答案:

答案 0 :(得分:0)

创建任务时会注册任务依赖项。请注意,必须在开始执行任务之前完成它们,因此您无法提出要求。

您是否考虑过直接定义buff1buff2的依赖关系而不是他们指向的内容?

mystruct* buff1;
mystruct* buff2;
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1) shared(buff1)
{
  int myid=omp_get_thread_num();
  buff1=buffers[myid];
  processA(data, buff1);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff2) shared(buff2)
{
  int myid=omp_get_thread_num();
  buff2=buffers[myid];
  processB(data, buff2);
}
#pragma omp task depend(in: data[0:1000]) depend(inout: buff1, buff2) // shared(buff1, buff2) ???
{
  processC(data, buff1, buff2);
}

注意这两个条款的含义差异非常重要:depend(inout: buff1)depend(inout: buff1[0:0])。第一个定义了对&buff1的依赖,而第二个定义了对&buff1[0] = &(*(buff1 + 0)) = buff1的依赖。通常,当任务生成指针本身的值(并且它通常与shared子句一起使用)时使用第一个,而在任务修改时使用第二个。该指针指向的数据。

最后,您没有指定buff1buff2变量的数据共享。如果必须从外部看到您的任务对这些变量所做的更改,则必须将这些变量注释为共享。