OpenMP变量默认共享吗?非局部变量作用域规则问询
OpenMP变量作用域与显式共享指定的疑问
我们知道局部循环变量默认是私有的,下面两段代码完全等价:
int i,j; #pragma omp parallel for private(i,j) for(i = 0; i < n; i++) { for(j = 0; j < n; j++) { //do something } }
等价于:
#pragma omp parallel for for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { //do something } }
接下来解答你的两个疑问:
1. 其他变量默认是共享的吗?
是的,除了有特殊默认规则的变量(比如循环迭代变量、并行区域内声明的局部变量等),在并行区域外声明的非局部变量默认都是共享的。比如函数参数、全局变量、并行区域外定义的局部变量,默认都会被所有线程共享访问。
2. 能否不指定shared(),直接使用a、size、sorted这些变量?
这取决于你是否使用了default(none)子句:
- 如果你没有加
default(none),完全可以直接使用这些变量——因为它们默认就是共享的,不需要显式声明shared()。 - 但在你的示例代码里特意加了
default(none),这会强制要求所有在并行区域内使用的变量都必须显式指定作用域(比如shared、private、reduction等),这种情况下就必须写shared(a, size, sorted),不然编译器会报错。
一般建议在复杂并行代码中使用default(none),它能帮你排查变量作用域的隐式错误,避免因默认规则理解偏差导致的bug。
内容的提问来源于stack exchange,提问作者IsLearning
相关产品推荐
相关产品推荐

