繁体   English   中英

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

[英]Why is class member variable x not allowed to be shared(x) in 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不是变量怎么回事?

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

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

不知道 - 但是请看看32个OpenMP陷阱,以便C ++开发人员解决大多数OpenMP问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM