在成员函数中,我可以像这样使用共享成员变量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
不是变量?
答案 0 :(得分:13)
OpenMP的大多数实现都概述了并行区域。也就是说,它们使它成为一种功能。私有变量通常传递给此函数,共享变量可以传递或在函数的范围内。类数据成员的问题是它们与变量不同。
当编译器概述并行区域时,变量具有定义的存储位置,编译器可以将其设置为传递给函数。在程序执行期间调用类之前,可能不会实例化数据成员(即,分配存储)。这意味着编译器不能自己私有化数据成员。它还必须在运行时完成,这将导致更多的工作,并将影响串行和并行程序的性能。到目前为止,没有任何实现尝试执行此工作,并且由于OpenMP规范是以协商一致方式编写的,因此决定禁止所有子句中的数据成员。否则,说它们被允许共享条款似乎太令人困惑,但没有其他条款。
答案 1 :(得分:1)
不清楚 - 但请仔细查看32 OpenMP traps for C++ developers以解决大多数OpenMP问题