我想知道在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版本进行比较,在数组中打印值并进行排序和比较。
答案 0 :(得分:1)
您的问题与private
子句中允许的变量名称数无关。相反,你的第一个例子在语法上是不正确的。
#pragma omp parallel for private(var1,var2,...i,k,l)
for(j = ...)
{
int var1;
int var2;
...
}
var1
和var2
在解析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 = ... )
{
...
...
}
}
}
}
在这种情况下,(i
,j
,k
,l
,var1
,var2
)列表中的变量不应出现在private
条款中。