在成员函数中,我可以int *x像这样使用共享成员变量进行并行化
#pragma omp parallel for default(shared)
for(int i=0;i<size;i++) {
x[i]=i;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试
#pragma omp parallel for default(none) shared(x,size)
for(int i=0;i<size;i++) {
x[i]=i;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:'obj::x' is not a variable in clause 'shared'.我更喜欢第二个版本,因为它宣布它正在使用的共享变量,提醒我确保没有竞争条件或类似的问题.
OpenMP声称这obj::x不是一个变量?
ejd*_*ejd 13
OpenMP的大多数实现概述了并行区域.也就是说,它们使它成为一种功能.私有变量通常传递给此函数,共享变量可以传递或在函数的范围内.类数据成员的问题是它们与变量不同.
当编译器概述并行区域时,变量具有定义的存储位置,编译器可以将其设置为传递给函数.在程序执行期间调用类之前,可能不会实例化数据成员(即,分配存储).这意味着编译器不能自己私有化数据成员.它还必须在运行时完成,这将导致更多的工作,并将影响串行和并行程序的性能.到目前为止,没有任何实现尝试执行此工作,并且由于OpenMP规范是以协商一致方式编写的,因此决定禁止所有子句中的数据成员.否则,说它们被允许共享条款似乎太令人困惑,但没有其他条款.
| 归档时间: |
|
| 查看次数: |
8456 次 |
| 最近记录: |