OpenMP中private()子句中的最大变量数

时间:2013-05-21 07:05:38

标签: c parallel-processing openmp

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

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

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

OR

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,而内部最多编译指示在私有变量列表中包含约21个变量。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

  

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

     
      
  • 具有自动存储持续时间的变量,该变量在其中的范围内声明   建筑是私人的。
  •   
     

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

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

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

在这种情况下,(ijklvar1var2)列表中的变量不应出现在private条款中。