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

10

在成员函数中,我可以像这样使用共享成员变量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不是一个变量?

你试过这个吗 -> x?还有你在用什么编译器? - Beanz
编译器是g++ 4.4。尝试使用#pragma omp parallel for default(none) shared(this->x,size)会出现错误error: expected unqualified-id before 'this' - Riko Jacob
2个回答

18

大多数OpenMP的实现都会概括并行区域。也就是说,它们会将其制作成一个函数。私有变量通常会传递到此函数中,共享变量可以传递或在函数的作用域内。类数据成员的问题在于它们与变量不同。

当编译器概括并行区域时,变量具有定义了存储位置,编译器可以设置为传递给函数。数据成员可能没有被实例化(即分配存储空间)直到程序执行期间调用该类。这意味着编译器不能自己对数据成员进行私有化。它还必须在运行时进行,并且这会导致更多的工作并影响串行和并行程序的性能。到目前为止,没有任何实现尝试完成这项工作,因为OpenMP规范是通过共识编写的,决定禁止在所有子句中使用数据成员。否则,这看起来会非常令人困惑,因为它们允许在共享子句中使用,但不允许在其他子句中使用。


1

1
我在链接的文档中没有找到与我的问题相关的参考资料。你能更具体地说明吗? - Riko Jacob
抱歉,我不知道确切的答案,我希望链接中有些东西可以帮助你。 - Martin Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接