OpenMP:局部variables是否自动私有?

#pragma omp parallel { int x; // private to each thread ? } #pragma omp parallel for for (int i = 0; i < 1000; ++i) { int x; // private to each thread ? } 

谢谢!

PS如果局部variables是自动私有的,那么使用私有子句有什么意义?

PS如果局部variables是自动私有的,那么使用私有子句有什么意义?

重要的是,在C的早期版本中,你需要在函数的开始处声明所有的variables,这仍然是stream行的风格。

就是这样的代码:

 #pragma omp parallel { int x; } 

是C ++中的首选方式。 但是在C的某些版本中,你不能使用这个代码,你需要使用private子句。

私人条款的原因是, 你不必改变你的代码 。

在没有私人原因的情况下并行化下面的代码的唯一方法

 int i,j; #pragma omp parallel for private(j) for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { //do something } } 

是改变代码。 比如像这样:

 int i #pragma omp parallel for for(i = 0; i < n; i++) { int j; for(j = 0; j < n; j++) { //do something } } 

这是非常有效的C89 / C90代码,但OpenMP的目标之一是不必更改代码,除了添加可在编译时启用或禁用的编译pragma语句。

并行区域内的数据对于每个线程都是私有的。

请参阅http://en.wikipedia.org/wiki/OpenMP#Data_sharing_attribute_clauses [数据共享属性条款]