gpt4 book ai didi

c++ - 当终止条件取决于来自不同部分的更新时,为什么 OMP 并行部分中的 while 循环无法终止

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:12 26 4
gpt4 key购买 nike

下面的 C++ 代码是合法的,还是我的编译器有问题?使用

将代码编译到共享库中

gcc 版本 4.4.6 20110731(红帽 4.4.6-3)(海湾合作委员会)

和 openMP,然后通过 R 2.15.2 调用。

int it=0;
#pragma omp parallel sections shared(it)
{
#pragma omp section
{
std::cout<<"Entering section A"<<std::endl;
for(it=0;it<10;it++)
{
std::cout<<"Iteration "<<it<<std::endl;

}
std::cout<<"Leaving section A with it="<<it<<std::endl;
}

#pragma omp section
{
std::cout<<"Entering section B with it="<<it<<std::endl;
while(it<10)
{
1;
}
std::cout<<"Leaving section B"<<std::endl;
}
}

我获得了以下输出(对于来自 2 个线程的交织输出表示歉意,但我认为它是可以解释的):

Entering section A
Iteration Entering section B with it=0
0
Iteration 1
Iteration 2
Iteration 3
Iteration 4
Iteration 5
Iteration 6
Iteration 7
Iteration 8
Iteration 9
Leaving section A with it=10

然后程序停止:B 部分似乎陷入了 while 循环。由于共享变量“it”,我不明白为什么当 A 部分完成时 while 循环没有终止。

最佳答案

那是因为shared变量只意味着它对所有线程都是一样的,但程序员仍然需要手动同步访问

SHARED Clause

It is the programmer's responsibility to ensure that multiple threads properly access SHARED variables (such as via CRITICAL sections)

因此,例如,您可以 flush第一部分完成后的变量:

      #pragma omp section
{
std::cout<<"Entering section A"<<std::endl;
for(it=0;it<10;it++)
{
std::cout<<"Iteration "<<it<<std::endl;

}
#pragma omp flush(it)
std::cout<<"Leaving section A with it="<<it<<std::endl;
}

#pragma omp section
{
std::cout<<"Entering section B with it="<<it<<std::endl;
while(it<10)
{
#pragma omp flush(it)
1;
}
std::cout<<"Leaving section B"<<std::endl;
}

关于c++ - 当终止条件取决于来自不同部分的更新时,为什么 OMP 并行部分中的 while 循环无法终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16305432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com