0

我想知道在 OpenMP 的 private() 子句中可以定义的变量数量是否有任何限制。

我有一个代码,它有 4 个带有很多变量的循环。最外层的 for 循环可以使用 pragma 轻松并行化。此外,最里面的循环也可以使用 pragma 并行化。但我一次只使用一个编译指示。(无论是最外层还是最内层)当然,在最内层循环中使用 pragma 是不可取的,因为线程创建的开销很大,因为它上面有 3 个 for 循环。我只是将 pragma 用于正确性测试目的。

#pragma omp parallel for private(var1,var2,...i,k,l)
for(j = ...) 
{ 
   int var1;
   int var2; 
    for (i = ... )
    {
        ...
        for(k = ...  )
        { 
            ...
            for(l = ... )
            {
             ...
             ...
            }
         }
     }
}

或者

for(j = ...) 
{ 
   int var1;
   int var2; 
    for (i = ... )
    {
        ...
        for(k = ...  )
        { 
            ...
            #pragma omp parallel for private(var3,var4)
            for(l = ... )
            {
             int var3;
             int var4;
            }
         }
     }
}

最外层 for 循环的正确性测试失败。与最内层循环相比,最外层循环的私有变量列表大约有 29 个,而最内层 pragma 包含大约 21 个私有变量列表中的变量。

我将 C 版本与 OpenMp 版本进行比较,打印数组中的值并进行排序和比较。

4

1 回答 1

1

private您的问题与子句中允许的变量名称的数量无关。相反,您的第一个示例在语法上不正确。

#pragma omp parallel for private(var1,var2,...i,k,l)
for(j = ...) 
{ 
   int var1;
   int var2;
   ...
}

在解析指令及其子句时var1,两者都未声明。您不必(实际上也不能)指定他们的共享类别。它们属于内部范围,因此具有预定的共享等级。OpenMP 规范 v3.1 中的 §2.9.1.1:var2parallel forprivate

某些变量和对象具有预定的数据共享属性,如下所示:

  • 在构造内部的作用域中声明的具有自动存储持续时间的变量是私有的。

具有预定数据共享属性的变量不得列在数据共享属性子句中,但下列情况除外。

如果可能,建议使用 C99 功能,并仅在引用它们的范围内声明循环变量,例如:

#pragma omp parallel for private(...)
for (int j = ...) 
{ 
   int var1;
   int var2; 
   for (int i = ... )
   {
      ...
      for (int k = ... )
      { 
         ...
         for (int l = ... )
         {
            ...
            ...
         }
      }
   }
}

在这种情况下, ( i, j, k, l, var1, var2) 列表中的任何变量都不应出现在private子句中。

于 2013-05-21T09:19:56.203 回答