假設我有一個乘以2 std::vector
的方法:的OpenMP:檢查嵌套parallesim
double multiply(std::vector<double> const& a, std::vector<double> const& b){
double tmp(0);
/*here I could easily do a parallelization with*/
/*#pragma omp parallel loop for*/
for(unsigned int i=0;i<a.size();i++){
tmp += a[i]*b[i];
}
return tmp;
}
如果我在此功能設置的編譯宏,以multiply(...)
通話將運行在所有線程 。
現在假設somewehere事我想做很多矢量乘法:
void many_multiplication(std::vector<double>* a, std::vector<double>* b, unsigned int N){
/*here I could easily do a parallelization with*/
/*#pragma omp parallel loop for*/
for(unsigned int i=0;i<N;i++){
for(unsigned int j=0;j<N;j++){
multiply(a[i],b[j]);
}
}
}
我還可以做並行的方式相同。但是這會導致 不需要的嵌套並行。
如何檢查,如果multiply(..)
是並行區域內調用, 那麼pragma
宏multiply(...)
是「關閉」。如果它從非平行區域被稱爲 ,那麼它是「開啓」的。
請注意您的示例代碼中的一個小錯字:您的「多個」函數會添加其輸入「vector」的值 – Novelocrat
@Novelocrat ... oups :-) – PinkFloyd