为什么不允许在OpenMP中共享类成员变量x(x)?

时间:2011-01-06 00:25:21

标签: c++ openmp

在成员函数中,我可以像这样使用共享成员变量int *x进行并行化

#pragma omp parallel for default(shared)
for(int i=0;i<size;i++) {
  x[i]=i;
}

但如果我尝试

#pragma omp parallel for default(none) shared(x,size)
for(int i=0;i<size;i++) {
  x[i]=i;
}

我收到错误:'obj::x' is not a variable in clause 'shared'。 我更喜欢第二个版本,因为它宣布它正在使用的共享变量,提醒我确保没有竞争条件或类似的问题。

OpenMP声称obj::x不是变量?

2 个答案:

答案 0 :(得分:13)

OpenMP的大多数实现都概述了并行区域。也就是说,它们使它成为一种功能。私有变量通常传递给此函数,共享变量可以传递或在函数的范围内。类数据成员的问题是它们与变量不同。

当编译器概述并行区域时,变量具有定义的存储位置,编译器可以将其设置为传递给函数。在程序执行期间调用类之前,可能不会实例化数据成员(即,分配存储)。这意味着编译器不能自己私有化数据成员。它还必须在运行时完成,这将导致更多的工作,并将影响串行和并行程序的性能。到目前为止,没有任何实现尝试执行此工作,并且由于OpenMP规范是以协商一致方式编写的,因此决定禁止所有子句中的数据成员。否则,说它们被允许共享条款似乎太令人困惑,但没有其他条款。

答案 1 :(得分:1)

不清楚 - 但请仔细查看32 OpenMP traps for C++ developers以解决大多数OpenMP问题