我试图了解 OMP 如何处理不同的for循环声明。我有:
int main()
{
int i, A[10000]={...};
double ave = 0.0;
#pragma omp parallel for reduction(+:ave)
for(i=0;i<10000;i++){
ave += A[i];
}
ave /= 10000;
printf("Average value = %0.4f\n",ave);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中{...}是从 1 到 10000 的数字。此代码打印正确的值。#pragma omp parallel for reduction(+:ave)如果我使用is#pragma omp parallel for private(ave)的结果代替。我想我明白什么是,但想知道它是否可以替代以及如何替代。printf0.0000reduction(oper:list)private
所以是的,您可以在没有该条款的情况下进行减少reduction。但这有一些您必须了解的缺点:
critical。无论如何,这是使用您的代码的示例:
int main() {
int i, A[10000]={...};
double ave = 0.0;
double localAve;
#pragma omp parallel private( i, localAve )
{
localAve = 0;
#pragma omp for
for( i = 0; i < 10000; i++ ) {
localAve += A[i];
}
#pragma omp critical
ave += localAve;
}
ave /= 10000;
printf("Average value = %0.4f\n",ave);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
reduction这是手动进行归约的经典方法,但请注意,此处未声明本来要声明的变量private。所成为的private是该变量的本地替代品,而全局变量必须保留shared。