2011-01-06 104 views
5

在一个成员函数,我可以并行使用共享成员变量int *x这样为什么不允许在OpenMP中共享类成员变量x(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不是一个变量?

+0

你试过这个 - > x?你也使用什么编译器? – Beanz 2011-01-06 16:26:05

+0

编译器是g ++ 4.4。尝试'#pragma omp parallel for default(none)shared(this-> x,size)'给出错误'error:expected'在'this'之前的非限定id'' – 2011-01-06 20:18:07

回答

11

OpenMP的大部分的实现勾勒出并行区域。也就是说,他们使它成为一种功能。私有变量通常被传递给这个函数,并且共享变量可以被传递或者在函数的作用域内。类数据成员的问题是它们与变量不同。

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

1

不precisiely知道 - 但看看通过32 OpenMP traps for C++ developers分拣出最OpenMP的问题

+1

感谢您的链接! – 2011-01-20 21:39:13

+0

我没有在链接的文档中找到对我的问题的任何参考。你可以说得更详细点吗? – 2011-01-21 12:40:08

+0

对不起,我没有确切的答案,我希望链接中会有东西可以帮助你 – 2011-01-21 19:13:31