>想象一下,在一个并行区域中有一个嵌套循环,如下所示:
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
或
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = i, ...) { }}}
如果我们使用 #pragma omp,i 索引会自动变为私有。但。。。 我们需要将 j 索引设置为私有还是公共?效果如何?
#pragma omp parallel
{
#pragma omp for shared(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
或
#pragma omp parallel
{
#pragma omp for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
提前感谢!
在并行区域内声明的所有内容都自动是私有的。这(大概(是你想要的行为:i
的每次迭代都应该遍历所有j
,j
循环都是独立的(因此是私有的,而不是公共的(。但是,您实际上缺少重要的parallel
部分:如果您不写
#pragma omp parallel for
但只有
#pragma omp for
那么你不会并行发生任何事情(除非你首先在封闭范围内创建了一个并行区域#pragma omp parallel
(!
私有 j不起作用,因为 j 默认是私有的(因为它的作用域在 i for 循环中,所以当创建新线程时,j 特定于该线程
#pragma omp parallel for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}
如果你使用shared j
它应该没有如上所述的效果,因为j的作用域是i的每个实例的局部,如果你将j的范围扩展到全局,你会遇到种族编码