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 [数据共享属性条款]