嵌套循环 OpenMP 并行化、私有索引还是公共索引?



>想象一下,在一个并行区域中有一个嵌套循环,如下所示:

#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的每次迭代都应该遍历所有jj循环都是独立的(因此是私有的,而不是公共的(。但是,您实际上缺少重要的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的范围扩展到全局,你会遇到种族编码

最新更新