我有疑问,并且在 OpenMP 文档中没有找到正确的答案。
如果我有这样的循环:
int i;
#pragma omp parallel for
for(i=0;i<10;i++)
//do some stuff
是变量i
隐式私有,我说得对吗?或者我必须定义为 private ,比如#pragma omp parallel for private(i)
?
相反,如果我有这样的循环:
int i,j;
#pragma omp parallel for
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
//do some stuff
仅变量i
将是隐式私有的,并且变量j
将被共享,因为默认情况下 OpenMP 仅将底层循环的控制循环变量“强制”为私有,对吗?
我可以提供一些参考资料来证实这些假设吗?
变量 i 是隐式私有的,对吗?或者我必须定义为
private ,就像 #pragma omp parallel for private(i) 一样?
是的,OpenMP 标准确保此类变量是隐式的private.
int i,j;
#pragma omp parallel for
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
只有变量 i 是隐式私有的,变量 j 是隐式私有的
被共享,因为默认情况下 OpenMP 仅“强制”为私有
底层循环的控制循环变量,我说得对吗?
是的你是对的。但是,如果您使用的是#pragma omp parallel for collapse(2)
,两个变量i
and j
将是私人的。
我可以提供一些参考资料来证实这些假设吗?
是的,来自OpenMP 5.1 标准 https://www.openmp.org/wp-content/uploads/OpenMP-API-Specification-5-1.pdf部分2.11.9 Loop Transformation Constructs
:
生成的循环的循环迭代变量始终是私有的
封闭团队、并行、SIMD 或任务生成构造。
并且也在2.21.1.1 Variables Referenced in a Construct
for、并行的任何关联循环中的循环迭代变量
for、taskloop 或 distribution 构造是私有的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)