parallelism , , OMP_NESTED true omp_set_nested(1); (§2.3.2 OpenMP) , , . :
double multiply(std::vector<double> const& a, std::vector<double> const& b){
double tmp(0);
int active_levels = omp_get_active_level();
#pragma omp parallel for reduction(+:tmp) if(active_level < 1)
for(unsigned int i=0;i<a.size();i++){
tmp += a[i]+b[i];
}
return tmp;
}
omp_get_active_level() , . 0, . if(active_level < 1) , , , .
OpenMP 3.0 (, MS Visual C/++ Compiler), omp_in_parallel():
double multiply(std::vector<double> const& a, std::vector<double> const& b){
double tmp(0);
int in_parallel = omp_in_parallel();
#pragma omp parallel for reduction(+:tmp) if(in_parallel == 0)
for(unsigned int i=0;i<a.size();i++){
tmp += a[i]+b[i];
}
return tmp;
}
omp_in_parallel() , , , .
, . , , , parallelism .